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.
- mplang/v1/kernels/phe.py +8 -4
- mplang/v1/runtime/channel.py +230 -0
- mplang/v1/runtime/communicator.py +37 -13
- mplang/v1/runtime/link_comm.py +135 -17
- mplang/v1/runtime/server.py +10 -1
- mplang/v1/runtime/session.py +11 -38
- mplang/v1/runtime/simulation.py +30 -8
- mplang/v2/backends/channel.py +217 -0
- mplang/v2/backends/crypto_impl.py +95 -0
- mplang/v2/backends/simp_worker/http.py +44 -13
- mplang/v2/backends/simp_worker/mem.py +9 -6
- mplang/v2/backends/spu_impl.py +18 -5
- mplang/v2/backends/spu_state.py +66 -3
- mplang/v2/dialects/crypto.py +101 -0
- mplang/v2/libs/device/api.py +30 -11
- mplang/v2/libs/ml/sgb.py +20 -32
- {mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/METADATA +2 -2
- {mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/RECORD +21 -19
- {mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/WHEEL +0 -0
- {mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/entry_points.txt +0 -0
- {mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/licenses/LICENSE +0 -0
mplang/v2/dialects/crypto.py
CHANGED
|
@@ -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
|
|
mplang/v2/libs/device/api.py
CHANGED
|
@@ -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
|
|
416
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
423
|
-
5. Both sides derive shared secret using
|
|
424
|
-
6.
|
|
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
|
|
466
|
-
#
|
|
467
|
-
|
|
468
|
-
|
|
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
|
-
|
|
1102
|
-
|
|
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
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1503
|
-
|
|
1504
|
-
|
|
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.
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
66
|
-
mplang/v1/runtime/server.py,sha256=
|
|
67
|
-
mplang/v1/runtime/session.py,sha256
|
|
68
|
-
mplang/v1/runtime/simulation.py,sha256=
|
|
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/
|
|
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=
|
|
91
|
-
mplang/v2/backends/spu_state.py,sha256=
|
|
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=
|
|
104
|
-
mplang/v2/backends/simp_worker/mem.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
174
|
-
mplang_nightly-0.1.
|
|
175
|
-
mplang_nightly-0.1.
|
|
176
|
-
mplang_nightly-0.1.
|
|
177
|
-
mplang_nightly-0.1.
|
|
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,,
|
|
File without changes
|
{mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev265.dist-info → mplang_nightly-0.1.dev267.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|