@wishknish/knishio-client-ts 0.9.7 → 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/dist/index.cjs CHANGED
@@ -3661,6 +3661,11 @@ var TokenUnit = class _TokenUnit {
3661
3661
  };
3662
3662
  }
3663
3663
  };
3664
+ var ML_KEM_PARAMS = {
3665
+ 1024: { kem: mlKem_js.ml_kem1024, pkBytes: 1568, skBytes: 3168, ctBytes: 1568 },
3666
+ 768: { kem: mlKem_js.ml_kem768, pkBytes: 1184, skBytes: 2400, ctBytes: 1088 }
3667
+ };
3668
+ var DEFAULT_ML_KEM_PARAMETER_SET = 1024;
3664
3669
  var Wallet = class _Wallet {
3665
3670
  token;
3666
3671
  balance;
@@ -3675,6 +3680,7 @@ var Wallet = class _Wallet {
3675
3680
  tokenUnits;
3676
3681
  tradeRates;
3677
3682
  molecules;
3683
+ mlKemParameterSet;
3678
3684
  // Token metadata (populated from query responses)
3679
3685
  tokenName;
3680
3686
  tokenAmount;
@@ -3688,8 +3694,14 @@ var Wallet = class _Wallet {
3688
3694
  address = null,
3689
3695
  position = null,
3690
3696
  batchId = null,
3691
- characters = null
3697
+ characters = null,
3698
+ mlKemParameterSet = DEFAULT_ML_KEM_PARAMETER_SET
3692
3699
  } = {}) {
3700
+ const paramSetNum = Number(mlKemParameterSet);
3701
+ if (!ML_KEM_PARAMS[paramSetNum]) {
3702
+ throw new Error(`KnishIO: unsupported ML-KEM parameter set ${mlKemParameterSet}; expected 1024 or 768.`);
3703
+ }
3704
+ this.mlKemParameterSet = paramSetNum;
3693
3705
  this.token = token;
3694
3706
  this.balance = "0";
3695
3707
  this.molecules = {};
@@ -3725,7 +3737,8 @@ var Wallet = class _Wallet {
3725
3737
  bundle = null,
3726
3738
  token = "USER",
3727
3739
  batchId = null,
3728
- characters = null
3740
+ characters = null,
3741
+ mlKemParameterSet = DEFAULT_ML_KEM_PARAMETER_SET
3729
3742
  }) {
3730
3743
  let position = null;
3731
3744
  if (!secret && !bundle) {
@@ -3741,7 +3754,8 @@ var Wallet = class _Wallet {
3741
3754
  token,
3742
3755
  position,
3743
3756
  batchId,
3744
- characters
3757
+ characters,
3758
+ mlKemParameterSet
3745
3759
  });
3746
3760
  }
3747
3761
  /**
@@ -3900,20 +3914,80 @@ var Wallet = class _Wallet {
3900
3914
  return (typeof this.position === "undefined" || this.position === null) && (typeof this.address === "undefined" || this.address === null);
3901
3915
  }
3902
3916
  // =============================================================================
3903
- // POST-QUANTUM CRYPTOGRAPHY - ML-KEM768 INTEGRATION
3917
+ // POST-QUANTUM CRYPTOGRAPHY - ML-KEM INTEGRATION
3904
3918
  // =============================================================================
3905
3919
  /**
3906
- * Initializes the ML-KEM key pair (matches JavaScript SDK exactly)
3920
+ * Derive an ML-KEM keypair for an arbitrary parameter set from the wallet's key seed,
3921
+ * without mutating the wallet. The 64-byte `d‖z` seed takes no parameter-set input — only
3922
+ * the final `keygen` call differs — so one KnishIO wallet owns both an ML-KEM-768 and an
3923
+ * ML-KEM-1024 identity and either can be reconstructed on demand.
3924
+ *
3925
+ * Returns `null` when the wallet holds no key — a secret-less wallet, which is what a molecule
3926
+ * deserializer builds for validation context. `generateSecret(null, …)` does NOT throw, so
3927
+ * without this the wallet would derive a plausible-looking identity from a bogus seed and fail
3928
+ * three layers down at AES-GCM instead of at the missing key. The guard lives here rather than
3929
+ * at each call site so a new caller cannot miss it.
3930
+ *
3931
+ * @param parameterSet - 1024 or 768
3907
3932
  */
3908
- initializeMLKEM() {
3933
+ deriveMlKemKeypair(parameterSet) {
3934
+ const params = ML_KEM_PARAMS[parameterSet];
3935
+ if (!params) {
3936
+ throw new Error(`KnishIO: unsupported ML-KEM parameter set ${parameterSet}; expected 1024 or 768.`);
3937
+ }
3938
+ if (!this.key) {
3939
+ return null;
3940
+ }
3909
3941
  const seedHex = generateSecret(this.key, 128);
3910
3942
  const seed = new Uint8Array(64);
3911
3943
  for (let i = 0; i < 64; i++) {
3912
3944
  seed[i] = parseInt(seedHex.substr(i * 2, 2), 16);
3913
3945
  }
3914
- const { publicKey, secretKey } = mlKem_js.ml_kem768.keygen(seed);
3915
- this.pubkey = this.serializeKey(publicKey);
3916
- this.privkey = secretKey;
3946
+ const { publicKey, secretKey } = params.kem.keygen(seed);
3947
+ return {
3948
+ pubkey: this.serializeKey(publicKey),
3949
+ privkey: secretKey,
3950
+ params
3951
+ };
3952
+ }
3953
+ /**
3954
+ * ML-KEM parameter set implied by a serialized public key's raw byte length. FIPS 203's key
3955
+ * lengths are disjoint (1568 bytes → ML-KEM-1024, 1184 bytes → ML-KEM-768), so a stored peer
3956
+ * key recovers the parameter set of the session it belongs to without a wire-format change.
3957
+ * Used by AuthToken.restore to resolve a snapshot that predates the field.
3958
+ *
3959
+ * @param pubkey - Base64-serialized ML-KEM public key
3960
+ * @return 1024, 768, or null when the length matches neither
3961
+ */
3962
+ static mlKemParameterSetFromPubkey(pubkey) {
3963
+ if (!pubkey) {
3964
+ return null;
3965
+ }
3966
+ let byteLength;
3967
+ try {
3968
+ byteLength = typeof Buffer !== "undefined" ? Buffer.from(pubkey, "base64").length : atob(pubkey).length;
3969
+ } catch {
3970
+ return null;
3971
+ }
3972
+ if (byteLength === ML_KEM_PARAMS[1024].pkBytes) {
3973
+ return 1024;
3974
+ }
3975
+ if (byteLength === ML_KEM_PARAMS[768].pkBytes) {
3976
+ return 768;
3977
+ }
3978
+ return null;
3979
+ }
3980
+ /**
3981
+ * Initializes the ML-KEM key pair (matches JavaScript SDK exactly). Only ever reached from the
3982
+ * constructor's `secret` branch, so the derivation cannot come back empty here.
3983
+ */
3984
+ initializeMLKEM() {
3985
+ const derived = this.deriveMlKemKeypair(this.mlKemParameterSet);
3986
+ if (!derived) {
3987
+ return;
3988
+ }
3989
+ this.pubkey = derived.pubkey;
3990
+ this.privkey = derived.privkey;
3917
3991
  }
3918
3992
  // =============================================================================
3919
3993
  // HIGH-LEVEL MESSAGE ENCRYPTION (JavaScript SDK Compatibility)
@@ -3922,13 +3996,13 @@ var Wallet = class _Wallet {
3922
3996
  const messageString = JSON.stringify(message);
3923
3997
  const messageUint8 = new TextEncoder().encode(messageString);
3924
3998
  const deserializedPubkey = this.deserializeKey(recipientPubkey);
3925
- const ML_KEM_768_PUBLIC_KEY_BYTES = 1184;
3926
- if (deserializedPubkey.length !== ML_KEM_768_PUBLIC_KEY_BYTES) {
3999
+ const params = ML_KEM_PARAMS[this.mlKemParameterSet];
4000
+ if (deserializedPubkey.length !== params.pkBytes) {
3927
4001
  throw new Error(
3928
- `KnishIO: cannot ML-KEM-encrypt \u2014 recipient public key is ${deserializedPubkey.length} bytes, expected ${ML_KEM_768_PUBLIC_KEY_BYTES} (ML-KEM-768). The node likely did not advertise an ML-KEM public key (upgrade the validator to a PQ-transport build), or authenticate with { encrypt: false }.`
4002
+ `KnishIO: cannot ML-KEM-encrypt \u2014 recipient public key is ${deserializedPubkey.length} bytes, expected ${params.pkBytes} (ML-KEM-${this.mlKemParameterSet}). The peer is not running ML-KEM-${this.mlKemParameterSet}; upgrade the peer, or step this client back to the other parameter set.`
3929
4003
  );
3930
4004
  }
3931
- const { cipherText, sharedSecret } = mlKem_js.ml_kem768.encapsulate(deserializedPubkey);
4005
+ const { cipherText, sharedSecret } = params.kem.encapsulate(deserializedPubkey);
3932
4006
  const encryptedMessage = await this.encryptWithSharedSecret(messageUint8, sharedSecret);
3933
4007
  return {
3934
4008
  cipherText: this.serializeKey(cipherText),
@@ -3940,15 +4014,37 @@ var Wallet = class _Wallet {
3940
4014
  return decryptedString === null ? null : JSON.parse(decryptedString);
3941
4015
  }
3942
4016
  /**
3943
- * ML-KEM768 decapsulate + AES-256-GCM decrypt → the RAW decrypted UTF-8 string (no JSON.parse).
4017
+ * ML-KEM decapsulate + AES-256-GCM decrypt → the RAW decrypted UTF-8 string (no JSON.parse).
3944
4018
  * Shared by {@link decryptMessage} (which JSON.parses the result) and the PQ CipherHash transport
3945
- * ({@link decryptMyMessageML768}, which needs the raw response JSON text). PQ-transport Phase E.
4019
+ * ({@link decryptMyMessageML}, which needs the raw response JSON text). PQ-transport Phase E.
3946
4020
  */
3947
4021
  async _mlkemDecryptToString(encryptedData) {
3948
4022
  const { cipherText, encryptedMessage } = encryptedData;
4023
+ const configuredParams = ML_KEM_PARAMS[this.mlKemParameterSet];
4024
+ const otherSet = this.mlKemParameterSet === 1024 ? 768 : 1024;
4025
+ const deserializedCipherText = this.deserializeKey(cipherText);
4026
+ let params = configuredParams;
4027
+ let decapsPrivkey = this.privkey;
4028
+ if (deserializedCipherText.length !== configuredParams.ctBytes) {
4029
+ if (deserializedCipherText.length !== ML_KEM_PARAMS[otherSet].ctBytes) {
4030
+ console.error(
4031
+ `Wallet::decryptMessage() - Ciphertext length mismatch: got ${deserializedCipherText.length}, expected ${configuredParams.ctBytes}`
4032
+ );
4033
+ return null;
4034
+ }
4035
+ const derived = this.deriveMlKemKeypair(otherSet);
4036
+ if (!derived) {
4037
+ console.error(
4038
+ `Wallet::decryptMessage() - cannot derive the ML-KEM-${otherSet} identity: wallet has no key`
4039
+ );
4040
+ return null;
4041
+ }
4042
+ params = derived.params;
4043
+ decapsPrivkey = derived.privkey;
4044
+ }
3949
4045
  let sharedSecret;
3950
4046
  try {
3951
- sharedSecret = mlKem_js.ml_kem768.decapsulate(this.deserializeKey(cipherText), this.privkey);
4047
+ sharedSecret = params.kem.decapsulate(deserializedCipherText, decapsPrivkey);
3952
4048
  } catch (e) {
3953
4049
  console.error("Wallet::decryptMessage() - Decapsulation failed", e);
3954
4050
  console.info("Wallet::decryptMessage() - my public key", this.pubkey);
@@ -3998,11 +4094,11 @@ var Wallet = class _Wallet {
3998
4094
  return this.serializeKey(bytes);
3999
4095
  }
4000
4096
  /**
4001
- * Post-quantum (ML-KEM768) CipherHash request envelope: a stringified single-recipient map
4097
+ * Post-quantum (ML-KEM) CipherHash request envelope: a stringified single-recipient map
4002
4098
  * `{ "<hashShare(recipientPubkey)>": {cipherText, encryptedMessage} }` (object-valued, via
4003
4099
  * {@link encryptMessage}). Matches the Rust validator's CipherHash handler. PQ-transport Phase E.
4004
4100
  */
4005
- async encryptStringML768(message, recipientPubkey) {
4101
+ async encryptStringML(message, recipientPubkey) {
4006
4102
  const envelope = await this.encryptMessage(message, recipientPubkey);
4007
4103
  return JSON.stringify({ [this.hashShare(recipientPubkey)]: envelope });
4008
4104
  }
@@ -4010,9 +4106,21 @@ var Wallet = class _Wallet {
4010
4106
  * Decrypt a CipherHash response map addressed to THIS wallet's ML-KEM pubkey
4011
4107
  * (`hashShare(this.pubkey)`) → the RAW decrypted GraphQL response JSON text (NOT JSON.parsed;
4012
4108
  * it replaces the HTTP response body for the normal parser). `null` if no entry / decrypt fails.
4109
+ *
4110
+ * A pre-bump peer addressed its envelope to `hashShare(our_768_pubkey)`, which a wallet
4111
+ * configured at ML-KEM-1024 would never find — so the other identity's share is tried too.
4112
+ * Without this, the permissive length dispatch in {@link _mlkemDecryptToString} is
4113
+ * unreachable on the transport path.
4013
4114
  */
4014
- async decryptMyMessageML768(map) {
4015
- const envelope = map[this.hashShare(this.pubkey)];
4115
+ async decryptMyMessageML(map) {
4116
+ let envelope = map[this.hashShare(this.pubkey)];
4117
+ if (!envelope) {
4118
+ const otherSet = this.mlKemParameterSet === 1024 ? 768 : 1024;
4119
+ const other = this.deriveMlKemKeypair(otherSet);
4120
+ if (other) {
4121
+ envelope = map[this.hashShare(other.pubkey)];
4122
+ }
4123
+ }
4016
4124
  if (!envelope) {
4017
4125
  return null;
4018
4126
  }
@@ -4166,7 +4274,8 @@ zod.z.object({
4166
4274
  serverSdkVersion: zod.z.number().int().min(1).optional(),
4167
4275
  logging: zod.z.boolean().optional(),
4168
4276
  defaultRequestPolicy: zod.z.enum(["cache-first", "cache-only", "network-only", "cache-and-network"]).nullable().optional(),
4169
- secretStorage: zod.z.unknown().optional()
4277
+ secretStorage: zod.z.unknown().optional(),
4278
+ mlKemParameterSet: zod.z.union([zod.z.literal(1024), zod.z.literal(768)]).optional()
4170
4279
  }).strict();
4171
4280
  zod.z.object({
4172
4281
  token: zod.z.string().min(1, "Auth token cannot be empty"),
@@ -5255,6 +5364,7 @@ var Molecule = class _Molecule {
5255
5364
  continuIdPosition;
5256
5365
  parentHashes;
5257
5366
  local;
5367
+ mlKemParameterSet = 1024;
5258
5368
  /**
5259
5369
  * Create new Molecule instance
5260
5370
  * Matches JavaScript SDK constructor signature
@@ -5266,7 +5376,8 @@ var Molecule = class _Molecule {
5266
5376
  remainderWallet = null,
5267
5377
  cellSlug = null,
5268
5378
  version = null,
5269
- continuIdPosition = null
5379
+ continuIdPosition = null,
5380
+ mlKemParameterSet = null
5270
5381
  } = {}) {
5271
5382
  this.status = null;
5272
5383
  this.molecularHash = null;
@@ -5278,6 +5389,7 @@ var Molecule = class _Molecule {
5278
5389
  this.continuIdPosition = continuIdPosition;
5279
5390
  this.atoms = [];
5280
5391
  this.parentHashes = [];
5392
+ this.mlKemParameterSet = mlKemParameterSet || sourceWallet?.mlKemParameterSet || 1024;
5281
5393
  const versionRegistry = versions_default;
5282
5394
  if (version !== null && Object.prototype.hasOwnProperty.call(versionRegistry, version)) {
5283
5395
  this.version = String(version);
@@ -5288,7 +5400,8 @@ var Molecule = class _Molecule {
5288
5400
  bundle,
5289
5401
  token: sourceWallet.token,
5290
5402
  batchId: sourceWallet.batchId,
5291
- characters: sourceWallet.characters
5403
+ characters: sourceWallet.characters,
5404
+ mlKemParameterSet: this.mlKemParameterSet
5292
5405
  });
5293
5406
  } else {
5294
5407
  this.remainderWallet = null;
@@ -5349,7 +5462,8 @@ var Molecule = class _Molecule {
5349
5462
  if (!this.remainderWallet || this.remainderWallet.token !== "USER") {
5350
5463
  this.remainderWallet = Wallet.create({
5351
5464
  secret: this.secret,
5352
- bundle: this.bundle
5465
+ bundle: this.bundle,
5466
+ mlKemParameterSet: this.mlKemParameterSet
5353
5467
  });
5354
5468
  }
5355
5469
  const continuIdMeta = {};
@@ -5736,7 +5850,8 @@ var Molecule = class _Molecule {
5736
5850
  }
5737
5851
  const burnWallet = new Wallet({
5738
5852
  bundle: "0000000000000000000000000000000000000000000000000000000000000000",
5739
- token: this.sourceWallet.token
5853
+ token: this.sourceWallet.token,
5854
+ mlKemParameterSet: this.mlKemParameterSet
5740
5855
  });
5741
5856
  this.addAtom(Atom.create({
5742
5857
  isotope: "V",
@@ -6008,7 +6123,8 @@ var Molecule = class _Molecule {
6008
6123
  position: data.sourceWallet.position,
6009
6124
  bundle: data.sourceWallet.bundle,
6010
6125
  batchId: data.sourceWallet.batchId,
6011
- characters: data.sourceWallet.characters
6126
+ characters: data.sourceWallet.characters,
6127
+ mlKemParameterSet: molecule.mlKemParameterSet
6012
6128
  });
6013
6129
  molecule.sourceWallet.balance = String(data.sourceWallet.balance != null ? data.sourceWallet.balance : 0);
6014
6130
  molecule.sourceWallet.address = data.sourceWallet.address;
@@ -6026,7 +6142,8 @@ var Molecule = class _Molecule {
6026
6142
  position: data.remainderWallet.position,
6027
6143
  bundle: data.remainderWallet.bundle,
6028
6144
  batchId: data.remainderWallet.batchId,
6029
- characters: data.remainderWallet.characters
6145
+ characters: data.remainderWallet.characters,
6146
+ mlKemParameterSet: molecule.mlKemParameterSet
6030
6147
  });
6031
6148
  molecule.remainderWallet.balance = String(data.remainderWallet.balance != null ? data.remainderWallet.balance : 0);
6032
6149
  molecule.remainderWallet.address = data.remainderWallet.address;
@@ -6124,7 +6241,8 @@ var Molecule = class _Molecule {
6124
6241
  secret: this.secret,
6125
6242
  bundle: this.bundle,
6126
6243
  token: this.sourceWallet.token,
6127
- batchId: this.sourceWallet.batchId
6244
+ batchId: this.sourceWallet.batchId,
6245
+ mlKemParameterSet: this.mlKemParameterSet
6128
6246
  });
6129
6247
  if (tradeRates) {
6130
6248
  bufferWallet.tradeRates = tradeRates;
@@ -6395,7 +6513,7 @@ var GraphQLClient = class {
6395
6513
  let encryptedRequest = false;
6396
6514
  let requestInit = init;
6397
6515
  if (wallet && serverPubkey && init && typeof init.body === "string" && this.shouldEncrypt(init.body)) {
6398
- const hashVar = await wallet.encryptStringML768(init.body, serverPubkey);
6516
+ const hashVar = await wallet.encryptStringML(init.body, serverPubkey);
6399
6517
  requestInit = { ...init, body: JSON.stringify({ query: CIPHER_HASH_QUERY, variables: { Hash: hashVar } }) };
6400
6518
  encryptedRequest = true;
6401
6519
  }
@@ -6415,7 +6533,7 @@ var GraphQLClient = class {
6415
6533
  if (typeof hash !== "string") {
6416
6534
  return new Response(text, init2);
6417
6535
  }
6418
- const decrypted = await wallet.decryptMyMessageML768(JSON.parse(hash));
6536
+ const decrypted = await wallet.decryptMyMessageML(JSON.parse(hash));
6419
6537
  return new Response(decrypted != null ? decrypted : text, init2);
6420
6538
  }
6421
6539
  setAuthData({
@@ -6584,6 +6702,22 @@ var AuthToken = class _AuthToken {
6584
6702
  authToken.setWallet(wallet);
6585
6703
  return authToken;
6586
6704
  }
6705
+ /**
6706
+ * ML-KEM parameter set a restored session must use, resolved in three tiers:
6707
+ * an explicit snapshot field, then the stored validator key's length, then ML-KEM-768.
6708
+ *
6709
+ * The final tier is deliberately NOT the constructor default. A snapshot with neither an
6710
+ * explicit field nor a recognisable key can only have come from a pre-bump build, and every
6711
+ * pre-bump build was 768-only — defaulting to 1024 would make the restored wallet advertise
6712
+ * a public key the validator never recorded for that token.
6713
+ */
6714
+ static resolveMlKemParameterSet(snapshot) {
6715
+ const explicit = snapshot.wallet?.mlKemParameterSet;
6716
+ if (explicit) {
6717
+ return Number(explicit) === 768 ? 768 : 1024;
6718
+ }
6719
+ return Wallet.mlKemParameterSetFromPubkey(snapshot.pubkey) ?? 768;
6720
+ }
6587
6721
  /**
6588
6722
  * Restore AuthToken from snapshot
6589
6723
  */
@@ -6591,8 +6725,9 @@ var AuthToken = class _AuthToken {
6591
6725
  const wallet = new Wallet({
6592
6726
  secret,
6593
6727
  token: "AUTH",
6594
- position: snapshot.wallet.position,
6595
- characters: snapshot.wallet.characters
6728
+ position: snapshot.wallet?.position ?? null,
6729
+ characters: snapshot.wallet?.characters ?? null,
6730
+ mlKemParameterSet: _AuthToken.resolveMlKemParameterSet(snapshot)
6596
6731
  });
6597
6732
  return _AuthToken.create({
6598
6733
  token: snapshot.token,
@@ -6660,7 +6795,9 @@ var AuthToken = class _AuthToken {
6660
6795
  };
6661
6796
  }
6662
6797
  /**
6663
- * Create snapshot for persistence
6798
+ * Create snapshot for persistence. The wallet's ML-KEM parameter set is recorded beside its
6799
+ * position and characters so a stepped-back ML-KEM-768 session restores as 768 rather than
6800
+ * silently taking the constructor default.
6664
6801
  */
6665
6802
  toSnapshot() {
6666
6803
  return {
@@ -6671,7 +6808,8 @@ var AuthToken = class _AuthToken {
6671
6808
  ...this.$__wallet ? {
6672
6809
  wallet: {
6673
6810
  position: this.$__wallet.position,
6674
- characters: this.$__wallet.characters
6811
+ characters: this.$__wallet.characters,
6812
+ mlKemParameterSet: this.$__wallet.mlKemParameterSet
6675
6813
  }
6676
6814
  } : {}
6677
6815
  };
@@ -6968,7 +7106,8 @@ var KnishIOClientConfigSchema2 = zod.z.object({
6968
7106
  // isn't rejected.
6969
7107
  defaultRequestPolicy: zod.z.enum(["cache-first", "cache-only", "network-only", "cache-and-network"]).nullable().optional(),
6970
7108
  // Pluggable hardware envelope encryption secret storage provider
6971
- secretStorage: zod.z.unknown().optional()
7109
+ secretStorage: zod.z.unknown().optional(),
7110
+ mlKemParameterSet: zod.z.union([zod.z.literal(1024), zod.z.literal(768)]).optional()
6972
7111
  }).strict();
6973
7112
  var EnvironmentConfigSchema = zod.z.object({
6974
7113
  NODE_ENV: zod.z.enum(["development", "production", "test"]).optional(),
@@ -9542,6 +9681,13 @@ var MutationProposeMolecule = class extends Mutation {
9542
9681
  molecule() {
9543
9682
  return this.$__molecule.toJSON ? this.$__molecule.toJSON() : this.$__molecule;
9544
9683
  }
9684
+ /**
9685
+ * Fills the molecule with specific mutation data.
9686
+ * Subclasses override to build domain-specific atoms.
9687
+ * Default implementation is a no-op for pre-assembled molecules.
9688
+ */
9689
+ fillMolecule(_params) {
9690
+ }
9545
9691
  };
9546
9692
 
9547
9693
  // src/response/ResponseCreateToken.ts
@@ -10647,6 +10793,7 @@ var KnishIOClient = class {
10647
10793
  $__authTokenObjects = {};
10648
10794
  $__authToken = null;
10649
10795
  $__authInProcess = false;
10796
+ $__mlKemParameterSet = 1024;
10650
10797
  $__remainderWallet = null;
10651
10798
  lastMoleculeQuery = null;
10652
10799
  abortControllers = /* @__PURE__ */ new Map();
@@ -10691,7 +10838,8 @@ var KnishIOClient = class {
10691
10838
  client,
10692
10839
  serverSdkVersion,
10693
10840
  logging,
10694
- defaultRequestPolicy
10841
+ defaultRequestPolicy,
10842
+ mlKemParameterSet: config.mlKemParameterSet ?? 1024
10695
10843
  });
10696
10844
  if (config.secretStorage) {
10697
10845
  this.$__secretStorage = config.secretStorage;
@@ -10707,10 +10855,12 @@ var KnishIOClient = class {
10707
10855
  client = null,
10708
10856
  serverSdkVersion = 3,
10709
10857
  logging = false,
10710
- defaultRequestPolicy = null
10858
+ defaultRequestPolicy = null,
10859
+ mlKemParameterSet = 1024
10711
10860
  }) {
10712
10861
  this.reset();
10713
10862
  this.$__logging = logging;
10863
+ this.setMlKemParameterSet(mlKemParameterSet);
10714
10864
  this.$__authTokenObjects = {};
10715
10865
  this.setUri(uri);
10716
10866
  if (cellSlug) {
@@ -10731,6 +10881,17 @@ var KnishIOClient = class {
10731
10881
  this.$__serverSdkVersion = serverSdkVersion;
10732
10882
  this.$__defaultRequestPolicy = defaultRequestPolicy;
10733
10883
  }
10884
+ getMlKemParameterSet() {
10885
+ return this.$__mlKemParameterSet || 1024;
10886
+ }
10887
+ setMlKemParameterSet(parameterSet) {
10888
+ const paramNum = Number(parameterSet);
10889
+ if (![1024, 768].includes(paramNum)) {
10890
+ throw new Error(`KnishIO: unsupported ML-KEM parameter set ${parameterSet}; expected 1024 or 768.`);
10891
+ }
10892
+ this.$__mlKemParameterSet = paramNum;
10893
+ return this;
10894
+ }
10734
10895
  /**
10735
10896
  * Get random uri from specified this.$__uris
10736
10897
  */
@@ -10967,7 +11128,8 @@ var KnishIOClient = class {
10967
11128
  bundle,
10968
11129
  token: "USER",
10969
11130
  batchId: sourceWallet.batchId,
10970
- characters: sourceWallet.characters
11131
+ characters: sourceWallet.characters,
11132
+ mlKemParameterSet: this.getMlKemParameterSet()
10971
11133
  }));
10972
11134
  return new Molecule({
10973
11135
  secret,
@@ -10976,7 +11138,8 @@ var KnishIOClient = class {
10976
11138
  remainderWallet: this.getRemainderWallet(),
10977
11139
  cellSlug: this.getCellSlug(),
10978
11140
  version: this.getServerSdkVersion(),
10979
- continuIdPosition
11141
+ continuIdPosition,
11142
+ mlKemParameterSet: this.getMlKemParameterSet()
10980
11143
  });
10981
11144
  }
10982
11145
  /**
@@ -11088,7 +11251,8 @@ var KnishIOClient = class {
11088
11251
  }))?.payload();
11089
11252
  if (!sourceWallet) {
11090
11253
  sourceWallet = new Wallet({
11091
- secret: this.getSecret()
11254
+ secret: this.getSecret(),
11255
+ mlKemParameterSet: this.getMlKemParameterSet()
11092
11256
  });
11093
11257
  } else {
11094
11258
  sourceWallet.key = Wallet.generateKey({
@@ -11131,7 +11295,8 @@ var KnishIOClient = class {
11131
11295
  }
11132
11296
  const recipientWallet = Wallet.create({
11133
11297
  bundle: bundleHash,
11134
- token
11298
+ token,
11299
+ mlKemParameterSet: this.getMlKemParameterSet()
11135
11300
  });
11136
11301
  if (batchId !== null) {
11137
11302
  recipientWallet.batchId = batchId;
@@ -11198,7 +11363,8 @@ var KnishIOClient = class {
11198
11363
  const recipientWallets = recipients.map((recipient) => {
11199
11364
  const recipientWallet = Wallet.create({
11200
11365
  bundle: recipient.bundleHash,
11201
- token
11366
+ token,
11367
+ mlKemParameterSet: this.getMlKemParameterSet()
11202
11368
  });
11203
11369
  if (recipient.batchId !== null && recipient.batchId !== void 0) {
11204
11370
  recipientWallet.batchId = recipient.batchId;
@@ -11822,7 +11988,8 @@ var KnishIOClient = class {
11822
11988
  secret: this.getSecret(),
11823
11989
  bundle: this.getBundle(),
11824
11990
  token,
11825
- batchId
11991
+ batchId,
11992
+ mlKemParameterSet: this.getMlKemParameterSet()
11826
11993
  });
11827
11994
  await mutation.fillMolecule({
11828
11995
  recipientWallet,
@@ -11890,7 +12057,8 @@ var KnishIOClient = class {
11890
12057
  const recipientWallet = new Wallet({
11891
12058
  secret: this.getSecret(),
11892
12059
  bundle: "0000000000000000000000000000000000000000000000000000000000000000",
11893
- token
12060
+ token,
12061
+ mlKemParameterSet: this.getMlKemParameterSet()
11894
12062
  });
11895
12063
  await mutation.fillMolecule({
11896
12064
  recipientWallet,
@@ -11967,7 +12135,8 @@ var KnishIOClient = class {
11967
12135
  const newWallet = new Wallet({
11968
12136
  secret: this.getSecret(),
11969
12137
  bundle: this.getBundle(),
11970
- token
12138
+ token,
12139
+ mlKemParameterSet: this.getMlKemParameterSet()
11971
12140
  });
11972
12141
  await mutation.fillMolecule(newWallet);
11973
12142
  const response = await this.executeQuery(mutation);
@@ -12098,15 +12267,30 @@ var KnishIOClient = class {
12098
12267
  async createPolicy({
12099
12268
  metaType,
12100
12269
  metaId,
12101
- policy = null
12270
+ policy = {}
12102
12271
  }) {
12103
12272
  this.log("info", `KnishIOClient::createPolicy() - Creating policy for ${metaType}:${metaId}...`);
12104
- return this.createMeta({
12273
+ const molecule = await this.createMolecule({});
12274
+ molecule.addPolicyAtom({
12105
12275
  metaType,
12106
12276
  metaId,
12107
- meta: null,
12108
- policy
12277
+ meta: {},
12278
+ policy: policy || {}
12109
12279
  });
12280
+ molecule.addContinuIdAtom();
12281
+ molecule.sign({
12282
+ bundle: this.getBundle()
12283
+ });
12284
+ molecule.check();
12285
+ const query = await this.createMoleculeMutation({
12286
+ mutationClass: MutationProposeMolecule,
12287
+ molecule
12288
+ });
12289
+ const response = await this.executeQuery(query);
12290
+ if (!response) {
12291
+ throw new CodeException("Policy creation failed");
12292
+ }
12293
+ return response;
12110
12294
  }
12111
12295
  /**
12112
12296
  * Create an identifier
@@ -12280,7 +12464,8 @@ var KnishIOClient = class {
12280
12464
  this.setSecret(secret);
12281
12465
  const wallet = new Wallet({
12282
12466
  secret,
12283
- token: "AUTH"
12467
+ token: "AUTH",
12468
+ mlKemParameterSet: this.getMlKemParameterSet()
12284
12469
  });
12285
12470
  const molecule = await this.createMolecule({
12286
12471
  secret,
@@ -12680,7 +12865,7 @@ function createDefaultSecretStorage(options = {}) {
12680
12865
  }
12681
12866
 
12682
12867
  // src/index.ts
12683
- var SDK_VERSION = "0.9.7";
12868
+ var SDK_VERSION = "1.0.0";
12684
12869
  var SDK_NAME = "KnishIO-Client-TS";
12685
12870
  var COMPATIBLE_SERVER_VERSIONS = [4, 5];
12686
12871
  var SDK_INFO = {
@@ -12689,7 +12874,7 @@ var SDK_INFO = {
12689
12874
  description: "TypeScript SDK for Knish.IO post-blockchain distributed ledger",
12690
12875
  compatibleServerVersions: COMPATIBLE_SERVER_VERSIONS,
12691
12876
  features: [
12692
- "Post-quantum cryptography (XMSS, ML-KEM768)",
12877
+ "Post-quantum cryptography (XMSS, ML-KEM-1024)",
12693
12878
  "Cross-platform compatibility",
12694
12879
  "Type-safe APIs",
12695
12880
  "DAG-based transaction processing",