mplang-nightly 0.1.dev265__py3-none-any.whl → 0.1.dev267__py3-none-any.whl

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.
@@ -199,6 +199,9 @@ select_p = el.Primitive[el.Object]("crypto.select")
199
199
  kem_keygen_p = el.Primitive[tuple[el.Object, el.Object]]("crypto.kem_keygen")
200
200
  kem_derive_p = el.Primitive[el.Object]("crypto.kem_derive")
201
201
 
202
+ # HKDF (Key Derivation Function)
203
+ hkdf_p = el.Primitive[el.Object]("crypto.hkdf")
204
+
202
205
  # Randomness
203
206
  random_bytes_p = el.Primitive[el.Object]("crypto.random_bytes")
204
207
 
@@ -336,6 +339,41 @@ def _kem_derive_ae(
336
339
  return SymmetricKeyType(suite)
337
340
 
338
341
 
342
+ @hkdf_p.def_abstract_eval
343
+ def _hkdf_ae(
344
+ secret: elt.BaseType, *, info: str, hash_algo: str = "sha256"
345
+ ) -> SymmetricKeyType:
346
+ """Abstract evaluation for HKDF key derivation.
347
+
348
+ Args:
349
+ secret: Input key material (SymmetricKeyType from kem_derive or TensorType[u8])
350
+ info: Context string for domain separation (required, non-empty, keyword-only)
351
+ hash_algo: Hash algorithm in lowercase without hyphens (e.g., "sha256", keyword-only)
352
+
353
+ Returns:
354
+ SymmetricKeyType with suite="hkdf-{hash_algo}"
355
+
356
+ Raises:
357
+ TypeError: If info or hash_algo is not a string
358
+ ValueError: If info is empty (required for domain separation per NIST)
359
+ """
360
+ # Validate info and hash_algo at trace time
361
+ if not isinstance(info, str) or not info:
362
+ raise ValueError(
363
+ "HKDF requires non-empty 'info' parameter for domain separation. "
364
+ "The info string binds the derived key to a specific protocol/context. "
365
+ "Recommended format: 'namespace/component/purpose/version'"
366
+ )
367
+ if not isinstance(hash_algo, str) or not hash_algo:
368
+ raise TypeError("hash_algo must be a non-empty string")
369
+
370
+ # Normalize: lowercase, no hyphens
371
+ hash_algo_normalized = hash_algo.lower().replace("-", "").replace("_", "")
372
+
373
+ # Return SymmetricKeyType with composite suite indicating derivation method
374
+ return SymmetricKeyType(suite=f"hkdf-{hash_algo_normalized}")
375
+
376
+
339
377
  @random_bytes_p.def_abstract_eval
340
378
  def _random_bytes_ae(length: int) -> elt.TensorType:
341
379
  return elt.TensorType(elt.u8, (length,))
@@ -472,6 +510,69 @@ def kem_derive(private_key: el.Object, public_key: el.Object) -> el.Object:
472
510
  return kem_derive_p.bind(private_key, public_key)
473
511
 
474
512
 
513
+ def hkdf(secret: el.Object, info: str, *, hash_algo: str = "sha256") -> el.Object:
514
+ """Derive a cryptographic key from input key material using HKDF.
515
+
516
+ HKDF (HMAC-based Key Derivation Function) is specified in RFC 5869 and
517
+ required by NIST SP 800-56C Rev.2 for deriving symmetric keys from
518
+ key agreement schemes like ECDH. Per NIST: "The shared secret output
519
+ from a key-agreement scheme SHALL NOT be used directly as a cryptographic
520
+ key. A key-derivation function (KDF) SHALL be used."
521
+
522
+ Args:
523
+ secret: Input key material (IKM). Accepts:
524
+ - SymmetricKeyValue: Typically from crypto.kem_derive (ECDH output)
525
+ - TensorType[u8, (N,)]: Raw bytes (N-byte secret)
526
+ info: Application-specific context string for domain separation.
527
+ REQUIRED and must be non-empty. Different info values produce
528
+ cryptographically independent keys even from the same secret.
529
+ Recommended format: "namespace/component/purpose/version"
530
+ Example: "mplang/device/tee/v2"
531
+ hash_algo: Hash function to use. Must be lowercase without hyphens.
532
+ Currently supported: "sha256" (default)
533
+ Future support planned: "sha512", "sha3256", "blake2b"
534
+ Default "sha256" provides 128-bit security level.
535
+
536
+ Returns:
537
+ SymmetricKeyValue with:
538
+ - suite: "hkdf-{hash_algo}" (e.g., "hkdf-sha256")
539
+ - key_bytes: 32-byte derived key suitable for AES-256-GCM
540
+
541
+ Security considerations:
542
+ - Output length: Fixed at 32 bytes (256 bits) for AES-256 keys
543
+ - Salt: Uses salt=None (acceptable for ECDH output per NIST guidance)
544
+ - Info: Provides protocol/context binding (domain separation)
545
+ - Deterministic: Same (secret, info, hash_algo) always produces same key
546
+
547
+ Raises:
548
+ ValueError:
549
+ - At abstract evaluation time if hash_algo is unsupported.
550
+ - At execution time if info is empty.
551
+ NotImplementedError:
552
+ - At execution time if hash_algo is not "sha256".
553
+
554
+ Examples:
555
+ >>> # Standard TEE session establishment
556
+ >>> sk_local, pk_local = crypto.kem_keygen("x25519")
557
+ >>> sk_remote, pk_remote = crypto.kem_keygen("x25519")
558
+ >>> # ECDH on both sides
559
+ >>> shared_local = crypto.kem_derive(sk_local, pk_remote)
560
+ >>> shared_remote = crypto.kem_derive(sk_remote, pk_local)
561
+ >>> # HKDF for domain separation
562
+ >>> sess_local = crypto.hkdf(shared_local, "mplang/device/tee/v2")
563
+ >>> sess_remote = crypto.hkdf(shared_remote, "mplang/device/tee/v2")
564
+ >>> # sess_local and sess_remote have identical key_bytes
565
+ >>> # but suite="hkdf-sha256" (not "x25519")
566
+ >>>
567
+ >>> # Derive multiple independent keys from one master secret
568
+ >>> master_secret = crypto.kem_derive(sk, pk)
569
+ >>> encryption_key = crypto.hkdf(master_secret, "app/encryption/v1")
570
+ >>> mac_key = crypto.hkdf(master_secret, "app/mac/v1")
571
+ >>> # encryption_key ≠ mac_key due to different info strings
572
+ """
573
+ return hkdf_p.bind(secret, info=info, hash_algo=hash_algo)
574
+
575
+
475
576
  def random_bytes(length: int) -> el.Object:
476
577
  """Generate cryptographically secure random bytes at runtime.
477
578
 
@@ -61,6 +61,9 @@ DEVICE_ATTR_NAME = "__device__"
61
61
  # Default KEM suite for TEE session establishment
62
62
  _TEE_KEM_SUITE: str = "x25519"
63
63
 
64
+ # HKDF info string for TEE session key derivation (domain separation)
65
+ _TEE_HKDF_INFO: str = "mplang/device/tee/v2"
66
+
64
67
  # Global cache for TEE sessions (keyed by (frm_dev_id, to_dev_id))
65
68
  # Each entry is (context_id, sess_frm, sess_tee) where context_id ensures
66
69
  # sessions are not reused across different trace/interp contexts.
@@ -412,16 +415,24 @@ def _ensure_tee_session(
412
415
  """Ensure a TEE session (sess_frm at sender, sess_tee at TEE) exists.
413
416
 
414
417
  Performs remote attestation and establishes an encrypted channel between
415
- a PPU and a TEE device. The session keys are cached to avoid repeated
416
- handshakes within the same execution context.
418
+ a PPU and a TEE device using NIST SP 800-56C compliant key derivation.
419
+ Session keys are cached within the same execution context to avoid
420
+ repeated handshakes.
417
421
 
418
- The protocol:
422
+ Protocol (ECDH + Remote Attestation + HKDF):
419
423
  1. TEE generates keypair (sk, pk) and creates attestation quote binding pk
420
- 2. Quote is sent to the sender (PPU) for verification
424
+ 2. Quote is sent to sender (PPU) for verification
421
425
  3. Sender verifies quote and extracts TEE's attested public key
422
- 4. Sender generates its own ephemeral keypair and sends pk to TEE
423
- 5. Both sides derive shared secret using ECDH (X25519)
424
- 6. The shared secret is used directly as the session key for AES-GCM
426
+ 4. Sender generates ephemeral keypair and sends pk to TEE
427
+ 5. Both sides derive ECDH shared secret using X25519
428
+ 6. Both sides derive session keys from shared secret using HKDF-SHA256
429
+ with protocol-specific info string for domain separation
430
+
431
+ Security properties:
432
+ - Remote attestation: TEE identity is cryptographically verified
433
+ - Ephemeral keys: Perfect forward secrecy (keys not reused across sessions)
434
+ - HKDF derivation: NIST SP 800-56C compliant (shared secret not used directly)
435
+ - Domain separation: Info parameter binds keys to TEE protocol v2
425
436
 
426
437
  Args:
427
438
  frm_dev_id: Source device ID (PPU)
@@ -462,10 +473,18 @@ def _ensure_tee_session(
462
473
  v_sk, v_pk = simp.pcall_static((frm_rank,), crypto.kem_keygen, _TEE_KEM_SUITE)
463
474
  v_pk_at_tee = simp.shuffle_static(v_pk, {tee_rank: frm_rank})
464
475
 
465
- # 5. Both sides derive shared secret (symmetric key) via ECDH
466
- # The shared secret from X25519 ECDH is suitable for direct use as AES key
467
- sess_frm = simp.pcall_static((frm_rank,), crypto.kem_derive, v_sk, tee_pk_at_sender)
468
- sess_tee = simp.pcall_static((tee_rank,), crypto.kem_derive, tee_sk, v_pk_at_tee)
476
+ # 5. Both sides derive ECDH shared secret using X25519
477
+ # Note: kem_derive signature is (private_key, public_key) - suite is in key type
478
+ shared_frm = simp.pcall_static(
479
+ (frm_rank,), crypto.kem_derive, v_sk, tee_pk_at_sender
480
+ )
481
+ shared_tee = simp.pcall_static((tee_rank,), crypto.kem_derive, tee_sk, v_pk_at_tee)
482
+
483
+ # 6. Derive session keys using HKDF-SHA256 for domain separation
484
+ # Per NIST SP 800-56C: "shared secret SHALL NOT be used directly as a key"
485
+ # HKDF provides: uniform distribution + protocol-specific context binding
486
+ sess_frm = simp.pcall_static((frm_rank,), crypto.hkdf, shared_frm, _TEE_HKDF_INFO)
487
+ sess_tee = simp.pcall_static((tee_rank,), crypto.hkdf, shared_tee, _TEE_HKDF_INFO)
469
488
 
470
489
  # Cache the session
471
490
  _tee_session_cache[key] = (current_context_id, sess_frm, sess_tee)
mplang/v2/libs/ml/sgb.py CHANGED
@@ -1097,11 +1097,9 @@ def _update_tree_state(
1097
1097
 
1098
1098
  all_feats[party_idx] = simp.pcall_static(
1099
1099
  (party_rank,),
1100
- lambda pf=all_feats[party_idx],
1101
- bf=all_feats_level[party_idx],
1102
- ci=cur_indices_party,
1103
- op=owned_party_party,
1104
- il=is_leaf_party: tensor.run_jax(update_party_feats, pf, bf, ci, op, il),
1100
+ lambda pf=all_feats[party_idx], bf=all_feats_level[party_idx], ci=cur_indices_party, op=owned_party_party, il=is_leaf_party: (
1101
+ tensor.run_jax(update_party_feats, pf, bf, ci, op, il)
1102
+ ),
1105
1103
  )
1106
1104
 
1107
1105
  def update_party_thresholds(
@@ -1123,21 +1121,17 @@ def _update_tree_state(
1123
1121
 
1124
1122
  all_thresholds[party_idx] = simp.pcall_static(
1125
1123
  (party_rank,),
1126
- lambda pt=all_thresholds[party_idx],
1127
- b=all_bins[party_idx],
1128
- bf=all_feats_level[party_idx],
1129
- bt_idx=all_threshs_level[party_idx],
1130
- ci=cur_indices_party,
1131
- op=owned_party_party,
1132
- il=is_leaf_party: tensor.run_jax(
1133
- update_party_thresholds,
1134
- pt,
1135
- b,
1136
- bf,
1137
- bt_idx,
1138
- ci,
1139
- op,
1140
- il,
1124
+ lambda pt=all_thresholds[party_idx], b=all_bins[party_idx], bf=all_feats_level[party_idx], bt_idx=all_threshs_level[party_idx], ci=cur_indices_party, op=owned_party_party, il=is_leaf_party: (
1125
+ tensor.run_jax(
1126
+ update_party_thresholds,
1127
+ pt,
1128
+ b,
1129
+ bf,
1130
+ bt_idx,
1131
+ ci,
1132
+ op,
1133
+ il,
1134
+ )
1141
1135
  ),
1142
1136
  )
1143
1137
 
@@ -1152,13 +1146,8 @@ def _update_tree_state(
1152
1146
 
1153
1147
  tmp_bt = simp.pcall_static(
1154
1148
  (party_rank,),
1155
- lambda bi=all_bin_indices[party_idx],
1156
- bf=all_feats_level[party_idx],
1157
- bt_idx=all_threshs_level[party_idx],
1158
- bt_arr=bt_party,
1159
- bt_lv=bt_level_party,
1160
- il=is_leaf_party: tensor.run_jax(
1161
- update_bt, bt_arr, bt_lv, il, bi, bf, bt_idx
1149
+ lambda bi=all_bin_indices[party_idx], bf=all_feats_level[party_idx], bt_idx=all_threshs_level[party_idx], bt_arr=bt_party, bt_lv=bt_level_party, il=is_leaf_party: (
1150
+ tensor.run_jax(update_bt, bt_arr, bt_lv, il, bi, bf, bt_idx)
1162
1151
  ),
1163
1152
  )
1164
1153
 
@@ -1498,11 +1487,10 @@ def predict_tree(
1498
1487
  for i, rank in enumerate(all_ranks):
1499
1488
  mask = simp.pcall_static(
1500
1489
  (rank,),
1501
- lambda d=all_datas[i],
1502
- f=tree.feature[i],
1503
- t=tree.threshold[i],
1504
- idx=i: predict_tree_single_party(
1505
- d, f, t, tree.is_leaf, tree.owned_party_id, idx, n_nodes
1490
+ lambda d=all_datas[i], f=tree.feature[i], t=tree.threshold[i], idx=i: (
1491
+ predict_tree_single_party(
1492
+ d, f, t, tree.is_leaf, tree.owned_party_id, idx, n_nodes
1493
+ )
1506
1494
  ),
1507
1495
  )
1508
1496
  # Transfer to AP
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mplang-nightly
3
- Version: 0.1.dev265
3
+ Version: 0.1.dev267
4
4
  Summary: Multi-Party Programming Language
5
5
  Author-email: SecretFlow Team <secretflow-contact@service.alipay.com>
6
6
  License: Apache License
@@ -219,7 +219,7 @@ Requires-Dist: pandas>=2.0.0
219
219
  Requires-Dist: protobuf<6.0,>=5.0
220
220
  Requires-Dist: pyarrow>=14.0.0
221
221
  Requires-Dist: pyyaml>=6.0
222
- Requires-Dist: spu>=0.10.0.dev20251208
222
+ Requires-Dist: spu>=0.10.0.dev20251211
223
223
  Requires-Dist: sqlglot>=23.0.0
224
224
  Requires-Dist: tenseal==0.3.16
225
225
  Requires-Dist: typing-extensions
@@ -34,7 +34,7 @@ mplang/v1/kernels/context.py,sha256=vvuwwLaO8iNDCXi_Riw1DqjZvIV8QIuZ3bBJlnAyNAA,
34
34
  mplang/v1/kernels/crypto.py,sha256=YsfaCYnwRZYVvetnT28G9GdqCxC7TNyka77ctIWzjmY,4260
35
35
  mplang/v1/kernels/fhe.py,sha256=FY-Gs2Kqa_xF_LOWLOuFL6BLcP9gdGxZOvcU5U8ktNs,30916
36
36
  mplang/v1/kernels/mock_tee.py,sha256=5O6HIl-lXYsRPBwu19QHDxnzARdSj5dbl-enYqQF6mo,2495
37
- mplang/v1/kernels/phe.py,sha256=2QxuJ_LnpjKyX8wGp5vasmkF68vUhiXJZYvcr3jZF7M,73100
37
+ mplang/v1/kernels/phe.py,sha256=OA8Fy_xRN5KavTzt7tR0E5XDavu2PsEcGpUr2jXmvd4,73156
38
38
  mplang/v1/kernels/spu.py,sha256=FsZpIyM5FltxeCXRaVuavo2VJeG-O0zQ3YGALCH36zM,12492
39
39
  mplang/v1/kernels/sql_duckdb.py,sha256=J4wBwmh0tu1GDf9r5S-hb-Cm7sLubUpAuU4LIVoU5Fs,1718
40
40
  mplang/v1/kernels/stablehlo.py,sha256=9HzfqiqyK5XCHPe3AhNN0IT4QrIUoLS44R8OLHF-pT0,3217
@@ -55,17 +55,18 @@ mplang/v1/protos/v1alpha1/mpir_pb2.pyi,sha256=dLxAtFW7mgFR-HYxC4ExI4jbtEWUGTKBvc
55
55
  mplang/v1/protos/v1alpha1/value_pb2.py,sha256=V9fqQTqXNo2efYmlP9xOhC7EpjBUp5jL-05yrJsAvWU,2785
56
56
  mplang/v1/protos/v1alpha1/value_pb2.pyi,sha256=47GVvuZfiV5oaVemwh0xTfns8OYTVBT8YnluIQeQPbs,7108
57
57
  mplang/v1/runtime/__init__.py,sha256=if0QGJEJMw8PkNyxghzxOdWlNJOEE3UZUnkqU3q2Znc,954
58
+ mplang/v1/runtime/channel.py,sha256=yfy-sI8nQJkINePnzYLtOs2bg7vYqC412uyjrSeDet8,7583
58
59
  mplang/v1/runtime/cli.py,sha256=xbnWqYoU35qJjgCk2M8dBg7hU1QqM7nKWbEKCKa_cz4,15343
59
60
  mplang/v1/runtime/client.py,sha256=FsKXrBcI0AQmGmwX7BhIhtTNFRmEhTyfNk2ruitf2Gg,15861
60
- mplang/v1/runtime/communicator.py,sha256=0PqX4K7wzf3Ru9WLDVVWogVNk6o43Yunj1Ddh5gl744,3973
61
+ mplang/v1/runtime/communicator.py,sha256=HukrYfnUihN4WfuURCKF8OF3vzelueGgMUEZGDMyhjE,5074
61
62
  mplang/v1/runtime/data_providers.py,sha256=DCj-QqVAGf9jNInPoJS9KjsfF79OZXSDT9IRytseH4E,10633
62
63
  mplang/v1/runtime/driver.py,sha256=2GONsWJG_USYXiqJMzHJkTwVCsJnsk9vu8bKuRQNk6g,11614
63
64
  mplang/v1/runtime/exceptions.py,sha256=c18U0xK20dRmgZo0ogTf5vXlkix9y3VAFuzkHxaXPEk,981
64
65
  mplang/v1/runtime/http_api.md,sha256=-re1DhEqMplAkv_wnqEU-PSs8tTzf4-Ml0Gq0f3Go6s,4883
65
- mplang/v1/runtime/link_comm.py,sha256=ZHNcis8QDu2rcyyF3rhpxMiJDkczoMA_c0iZ2GDW_bA,2793
66
- mplang/v1/runtime/server.py,sha256=F7xf-B3taqFO_rlZGYi3PLooHhOrjpDDfg-zxc3ZG5k,16625
67
- mplang/v1/runtime/session.py,sha256=fnbtPzMOeZ7-NuPZ0Oz5NeKEOkvMxmRehZ5m5SWNBNc,10786
68
- mplang/v1/runtime/simulation.py,sha256=_oaCdgxK0Aohf52n4fG8Peoa6yFp_45ACVDCCqq5n9s,11481
66
+ mplang/v1/runtime/link_comm.py,sha256=4WMq-MTaXe5CboVV_HABxq_o2p863bOXg-E3vy4tKwU,6808
67
+ mplang/v1/runtime/server.py,sha256=1KSgwT0Lm1NNL_sLTf9Rr7EoIsN-gHARfs_h8dzdnLM,16997
68
+ mplang/v1/runtime/session.py,sha256=-H9W4yRatLC_feOFAorXQbR5vb1imkNoefWwjKUe4-k,9648
69
+ mplang/v1/runtime/simulation.py,sha256=S8_v6aHVzx3OI4w-VYLW3CmCjJslViBDPn5sVYcsOsQ,12179
69
70
  mplang/v1/simp/__init__.py,sha256=2WE4cmW96Xkzyq2yRRYNww4kZ5o6u6NbPV0BxqZG698,581
70
71
  mplang/v1/simp/api.py,sha256=X-NePnIoUfVpumYiffwNGIXnCXZ6zWzwSUmNju_fAbo,13906
71
72
  mplang/v1/simp/mpi.py,sha256=EAVWH8vLSkXrobmgyNUrwbHqzL4F8wufoKQmTzXCR28,4751
@@ -82,13 +83,14 @@ mplang/v2/cli.py,sha256=QtiTFG418k26opRy4GhVV8fwFqRS11xTLH3xRCIIm6M,19665
82
83
  mplang/v2/cli_guide.md,sha256=kyoCaqkvIJJ1vsvCyBu3qgOuRSb0txu9BDZoy9GU5S0,3617
83
84
  mplang/v2/backends/__init__.py,sha256=H-4-jBEPWBZl6XT7AxBShRINnruF_f_2lB4iaiQoXME,1988
84
85
  mplang/v2/backends/bfv_impl.py,sha256=cQPinze3c2xN4CmIIoXxZoIEhu9ynoGaXbdF95z_aTE,25709
85
- mplang/v2/backends/crypto_impl.py,sha256=-4-ry7rXgPjkuM-KTFc4pG3k-O5dSNTEkcMR4W2LtJg,19327
86
+ mplang/v2/backends/channel.py,sha256=t8P7RphNnhvo3Zj08hX85d7PxgWQXiMGNYfZPK_4YoM,6622
87
+ mplang/v2/backends/crypto_impl.py,sha256=tU0KdI34hnYvYujKUkiA1XYpvy4lo_MKpidt0NSIKlk,23205
86
88
  mplang/v2/backends/field_impl.py,sha256=50sKGOlkUiaTj_IAola86uQeoi-fxV0o7G91BdTCWZA,14788
87
89
  mplang/v2/backends/func_impl.py,sha256=R0662cC0gSSfkjuLyevJ_g4bJDJirY76LTFYqEimCkE,3585
88
90
  mplang/v2/backends/phe_impl.py,sha256=r836e_qBHGrHhfnFail5IaUDzvS7bABjdEQmJmAtBVI,4127
89
91
  mplang/v2/backends/simp_design.md,sha256=CXvfxrvV1TmKlFm8IbKTbcHHwLl6AhwlY_cNqMdff_Y,5250
90
- mplang/v2/backends/spu_impl.py,sha256=nDmpntXMKlFhaOUMXAOO_-RZTzqGLsgxEvwJuVA6h1g,9047
91
- mplang/v2/backends/spu_state.py,sha256=wj876IvNPhKyWISN6WwKBYoaDQFFJ8jemdJUVeH5IfA,4144
92
+ mplang/v2/backends/spu_impl.py,sha256=8F4oXmVEr-lt9mrT5fdNznrJZeznwOd7CrmB0-dVtx8,9475
93
+ mplang/v2/backends/spu_state.py,sha256=u84hgLhcCcpKvseXwtVa2hC9fj_HrLCVNHy6LMd37rE,6569
92
94
  mplang/v2/backends/store_impl.py,sha256=RyhADTNsnnNnwsatAMr7eeewXkVXtfNWA1oFiLXg8H0,2222
93
95
  mplang/v2/backends/table_impl.py,sha256=Qmd-Z_PLjSbDngWkHz0wc6VykoGHfS2-rCOk1aWudws,27566
94
96
  mplang/v2/backends/tee_impl.py,sha256=Gp-vqqJPtEMNqP7y68tLhL3a-EW3BQwpo_qCJOSHqKs,7044
@@ -100,13 +102,13 @@ mplang/v2/backends/simp_driver/ops.py,sha256=UeVC3eaCUwxrkN6OsJyMYj8qMDufMFQI0Yo
100
102
  mplang/v2/backends/simp_driver/state.py,sha256=6tQyQg_PNzHOJkjCoNm51Wvknl3XiJZzpQXuRB4qRtM,1719
101
103
  mplang/v2/backends/simp_driver/values.py,sha256=OQ_7Kt6l7Pcfx5eB6GVbpunS6CG60Lj0AS6H9Wx9sKQ,1515
102
104
  mplang/v2/backends/simp_worker/__init__.py,sha256=93VMzntLN1kpePK1KoLsU3J3RU-krgV3smCRRRo-xKA,970
103
- mplang/v2/backends/simp_worker/http.py,sha256=ZISNYsYSXr5a4wtC59vGfGV9vVOR_pZF39pZgzLx8zk,11630
104
- mplang/v2/backends/simp_worker/mem.py,sha256=aigiER6t8H8MHVKm2Trw0CXQks24qgpAh_wEvLGPA28,3389
105
+ mplang/v2/backends/simp_worker/http.py,sha256=HI4Kj8tsN8Z058m9D_8cU22d37VzQTlN4PW7d30dxSE,12656
106
+ mplang/v2/backends/simp_worker/mem.py,sha256=coDvztNDLlflCh2oGNuO0PSMILKZ28Fvyfhks4Vsnzc,3577
105
107
  mplang/v2/backends/simp_worker/ops.py,sha256=DMQCsKeoMtemy5ozsVZt2eoF8NZlhLeHZMDgnBSP29I,5525
106
108
  mplang/v2/backends/simp_worker/state.py,sha256=eRUI7MP6gU8KPC9-H5fwcoAPKOsfW2ODWvpoKWbecMk,1554
107
109
  mplang/v2/dialects/__init__.py,sha256=hvzAvz6_brfFyDGgKknoPdgh5EY033YNYwotuJK_zoA,1493
108
110
  mplang/v2/dialects/bfv.py,sha256=XrE3FX9DHWqNzUVzY0tuwPvNVVRZYpD51JZIZF-q-l4,22350
109
- mplang/v2/dialects/crypto.py,sha256=rgJh_VO971MR-0D5jryz8osItF0Q4aGYhlEYjV_hBEE,17503
111
+ mplang/v2/dialects/crypto.py,sha256=dH_DtoE3pGAKeOLPHxeyGtXC-nGwBsOs62TKikJEaq0,22197
110
112
  mplang/v2/dialects/dtypes.py,sha256=bGM3Jna3BnvE4MPOurWrEmQegGPxd26z1HIWox1rj0U,12104
111
113
  mplang/v2/dialects/field.py,sha256=6nBJg08k5WHb2o5msr8XAnxMQLpoTej55VQ7iSRnC4o,6380
112
114
  mplang/v2/dialects/func.py,sha256=UlaMof4NEG28VOtiRL7zBRYgFbIX74YTqqgvozbils0,4375
@@ -138,10 +140,10 @@ mplang/v2/kernels/okvs_opt.cpp,sha256=d_HhvMdcebYsG2x7kYzjuFgmEsh9WKLH6SHee3375B
138
140
  mplang/v2/kernels/py_kernels.py,sha256=FDsD86IHV-UBzxZLolhSOkrp24PuboHXeb1gBHLOfMo,12073
139
141
  mplang/v2/libs/collective.py,sha256=pfXq9tmFUNKjeHhWMTjtzOi-m2Fn1lLru1G6txZVyic,10683
140
142
  mplang/v2/libs/device/__init__.py,sha256=mXsSvXrWmlHu6Ch87Vcd85m4L_qdDkbSvJyHyuai2fc,1251
141
- mplang/v2/libs/device/api.py,sha256=8i0KP3q_XbOfPYB9fzs7pA6vVY4Ib6lxdoiwAi_RlmU,27838
143
+ mplang/v2/libs/device/api.py,sha256=d_Wbka8bxxXsRMW6zDhjzL9LPtChSk2-ryfi-c4Mqsk,28830
142
144
  mplang/v2/libs/device/cluster.py,sha256=YUqYZ_IBS6rpV5ejUFP3kTxcTQHSyeDeuaJcsiFY_Js,12508
143
145
  mplang/v2/libs/ml/__init__.py,sha256=xTxhC_YwHP32muUEFCEwOjc-3Ml-vmO48NNECU90zm4,787
144
- mplang/v2/libs/ml/sgb.py,sha256=qoJww01EEbWo9nvwB5w-JZqx9BchcmhSrToypxV7fPg,60297
146
+ mplang/v2/libs/ml/sgb.py,sha256=T6GF9kYMHvuoffB567UlcwDoDCJ2SH7vttAABmgdmvU,60223
145
147
  mplang/v2/libs/mpc/__init__.py,sha256=znADXBv0cATTvNN9pVOH8V47O5vmYZnR1Y7tfh1QVjw,1405
146
148
  mplang/v2/libs/mpc/_utils.py,sha256=Xzt5jIQSm2e8_xFC6zrdKL93IqbTDb40apk2JBbEgBI,3215
147
149
  mplang/v2/libs/mpc/analytics/__init__.py,sha256=8_1Sm05nrO2ISat1hNZT6UXHpKQ-SDBby1eeS-wm_fE,1204
@@ -170,8 +172,8 @@ mplang/v2/runtime/dialect_state.py,sha256=HxO1i4kSOujS2tQzAF9-WmI3nChSaGgupf2_07
170
172
  mplang/v2/runtime/interpreter.py,sha256=UzrM5oepka6H0YKRZncNXhsuwKVm4pliG5J92fFRZMI,32300
171
173
  mplang/v2/runtime/object_store.py,sha256=yT6jtKG2GUEJVmpq3gnQ8mCMvUFYzgBciC5A-J5KRdk,5998
172
174
  mplang/v2/runtime/value.py,sha256=CMOxElJP78v7pjasPhEpbxWbSgB2KsLbpPmzz0mQX0E,4317
173
- mplang_nightly-0.1.dev265.dist-info/METADATA,sha256=Dr04ggCRHYxf8ck9AcrmmgPfHhBmrvDwUfWHXjvTS-w,16775
174
- mplang_nightly-0.1.dev265.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
175
- mplang_nightly-0.1.dev265.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
176
- mplang_nightly-0.1.dev265.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
177
- mplang_nightly-0.1.dev265.dist-info/RECORD,,
175
+ mplang_nightly-0.1.dev267.dist-info/METADATA,sha256=fWTmQUUYcAYzXHVW7m_4CxvnQb7w4qbWn5vZ7yffuoU,16775
176
+ mplang_nightly-0.1.dev267.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
177
+ mplang_nightly-0.1.dev267.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
178
+ mplang_nightly-0.1.dev267.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
179
+ mplang_nightly-0.1.dev267.dist-info/RECORD,,