mplang-nightly 0.1.dev268__py3-none-any.whl → 0.1.dev270__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/__init__.py +391 -17
- mplang/{v2/backends → backends}/__init__.py +9 -7
- mplang/{v2/backends → backends}/bfv_impl.py +6 -6
- mplang/{v2/backends → backends}/crypto_impl.py +6 -6
- mplang/{v2/backends → backends}/field_impl.py +5 -5
- mplang/{v2/backends → backends}/func_impl.py +4 -4
- mplang/{v2/backends → backends}/phe_impl.py +3 -3
- mplang/{v2/backends → backends}/simp_design.md +1 -1
- mplang/{v2/backends → backends}/simp_driver/__init__.py +5 -5
- mplang/{v2/backends → backends}/simp_driver/http.py +8 -8
- mplang/{v2/backends → backends}/simp_driver/mem.py +9 -9
- mplang/{v2/backends → backends}/simp_driver/ops.py +4 -4
- mplang/{v2/backends → backends}/simp_driver/state.py +2 -2
- mplang/{v2/backends → backends}/simp_driver/values.py +2 -2
- mplang/{v2/backends → backends}/simp_worker/__init__.py +3 -3
- mplang/{v2/backends → backends}/simp_worker/http.py +10 -10
- mplang/{v2/backends → backends}/simp_worker/mem.py +1 -1
- mplang/{v2/backends → backends}/simp_worker/ops.py +5 -5
- mplang/{v2/backends → backends}/simp_worker/state.py +2 -4
- mplang/{v2/backends → backends}/spu_impl.py +8 -8
- mplang/{v2/backends → backends}/spu_state.py +4 -4
- mplang/{v2/backends → backends}/store_impl.py +3 -3
- mplang/{v2/backends → backends}/table_impl.py +8 -8
- mplang/{v2/backends → backends}/tee_impl.py +6 -6
- mplang/{v2/backends → backends}/tensor_impl.py +6 -6
- mplang/{v2/cli.py → cli.py} +9 -9
- mplang/{v2/cli_guide.md → cli_guide.md} +12 -12
- mplang/{v2/dialects → dialects}/__init__.py +5 -5
- mplang/{v2/dialects → dialects}/bfv.py +6 -6
- mplang/{v2/dialects → dialects}/crypto.py +5 -5
- mplang/{v2/dialects → dialects}/dtypes.py +2 -2
- mplang/{v2/dialects → dialects}/field.py +3 -3
- mplang/{v2/dialects → dialects}/func.py +2 -2
- mplang/{v2/dialects → dialects}/phe.py +6 -6
- mplang/{v2/dialects → dialects}/simp.py +6 -6
- mplang/{v2/dialects → dialects}/spu.py +7 -7
- mplang/{v2/dialects → dialects}/store.py +2 -2
- mplang/{v2/dialects → dialects}/table.py +3 -3
- mplang/{v2/dialects → dialects}/tee.py +6 -6
- mplang/{v2/dialects → dialects}/tensor.py +5 -5
- mplang/{v2/edsl → edsl}/__init__.py +3 -3
- mplang/{v2/edsl → edsl}/context.py +6 -6
- mplang/{v2/edsl → edsl}/graph.py +5 -5
- mplang/{v2/edsl → edsl}/jit.py +2 -2
- mplang/{v2/edsl → edsl}/object.py +1 -1
- mplang/{v2/edsl → edsl}/primitive.py +5 -5
- mplang/{v2/edsl → edsl}/printer.py +1 -1
- mplang/{v2/edsl → edsl}/serde.py +1 -1
- mplang/{v2/edsl → edsl}/tracer.py +7 -7
- mplang/{v2/edsl → edsl}/typing.py +1 -1
- mplang/{v2/kernels → kernels}/ldpc.cpp +13 -13
- mplang/{v2/kernels → kernels}/okvs.cpp +4 -4
- mplang/{v2/kernels → kernels}/okvs_opt.cpp +46 -31
- mplang/{v2/kernels → kernels}/py_kernels.py +1 -1
- mplang/{v2/libs → libs}/collective.py +5 -5
- mplang/{v2/libs → libs}/device/__init__.py +1 -1
- mplang/{v2/libs → libs}/device/api.py +12 -12
- mplang/{v2/libs → libs}/ml/__init__.py +1 -1
- mplang/{v2/libs → libs}/ml/sgb.py +4 -4
- mplang/{v2/libs → libs}/mpc/__init__.py +3 -3
- mplang/{v2/libs → libs}/mpc/_utils.py +2 -2
- mplang/{v2/libs → libs}/mpc/analytics/aggregation.py +1 -1
- mplang/{v2/libs → libs}/mpc/analytics/groupby.py +2 -2
- mplang/{v2/libs → libs}/mpc/analytics/permutation.py +3 -3
- mplang/{v2/libs → libs}/mpc/ot/base.py +3 -3
- mplang/{v2/libs → libs}/mpc/ot/extension.py +2 -2
- mplang/{v2/libs → libs}/mpc/ot/silent.py +4 -4
- mplang/{v2/libs → libs}/mpc/psi/cuckoo.py +3 -3
- mplang/{v2/libs → libs}/mpc/psi/okvs.py +1 -1
- mplang/{v2/libs → libs}/mpc/psi/okvs_gct.py +19 -13
- mplang/{v2/libs → libs}/mpc/psi/oprf.py +3 -3
- mplang/libs/mpc/psi/rr22.py +303 -0
- mplang/{v2/libs → libs}/mpc/psi/unbalanced.py +4 -4
- mplang/{v2/libs → libs}/mpc/vole/gilboa.py +3 -3
- mplang/{v2/libs → libs}/mpc/vole/ldpc.py +2 -2
- mplang/{v2/libs → libs}/mpc/vole/silver.py +6 -6
- mplang/{v2/runtime → runtime}/interpreter.py +11 -11
- mplang/{v2/runtime → runtime}/value.py +2 -2
- mplang/{v1/runtime → utils}/__init__.py +18 -15
- mplang/{v1/utils → utils}/func_utils.py +1 -1
- {mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/METADATA +2 -2
- mplang_nightly-0.1.dev270.dist-info/RECORD +102 -0
- mplang/v1/__init__.py +0 -157
- mplang/v1/_device.py +0 -602
- mplang/v1/analysis/__init__.py +0 -37
- mplang/v1/analysis/diagram.py +0 -567
- mplang/v1/core/__init__.py +0 -157
- mplang/v1/core/cluster.py +0 -343
- mplang/v1/core/comm.py +0 -281
- mplang/v1/core/context_mgr.py +0 -50
- mplang/v1/core/dtypes.py +0 -335
- mplang/v1/core/expr/__init__.py +0 -80
- mplang/v1/core/expr/ast.py +0 -542
- mplang/v1/core/expr/evaluator.py +0 -581
- mplang/v1/core/expr/printer.py +0 -285
- mplang/v1/core/expr/transformer.py +0 -141
- mplang/v1/core/expr/utils.py +0 -78
- mplang/v1/core/expr/visitor.py +0 -85
- mplang/v1/core/expr/walk.py +0 -387
- mplang/v1/core/interp.py +0 -160
- mplang/v1/core/mask.py +0 -325
- mplang/v1/core/mpir.py +0 -965
- mplang/v1/core/mpobject.py +0 -117
- mplang/v1/core/mptype.py +0 -407
- mplang/v1/core/pfunc.py +0 -130
- mplang/v1/core/primitive.py +0 -877
- mplang/v1/core/table.py +0 -218
- mplang/v1/core/tensor.py +0 -75
- mplang/v1/core/tracer.py +0 -383
- mplang/v1/host.py +0 -130
- mplang/v1/kernels/__init__.py +0 -41
- mplang/v1/kernels/base.py +0 -125
- mplang/v1/kernels/basic.py +0 -240
- mplang/v1/kernels/context.py +0 -369
- mplang/v1/kernels/crypto.py +0 -122
- mplang/v1/kernels/fhe.py +0 -858
- mplang/v1/kernels/mock_tee.py +0 -72
- mplang/v1/kernels/phe.py +0 -1864
- mplang/v1/kernels/spu.py +0 -341
- mplang/v1/kernels/sql_duckdb.py +0 -44
- mplang/v1/kernels/stablehlo.py +0 -90
- mplang/v1/kernels/value.py +0 -626
- mplang/v1/ops/__init__.py +0 -35
- mplang/v1/ops/base.py +0 -424
- mplang/v1/ops/basic.py +0 -294
- mplang/v1/ops/crypto.py +0 -262
- mplang/v1/ops/fhe.py +0 -272
- mplang/v1/ops/jax_cc.py +0 -147
- mplang/v1/ops/nnx_cc.py +0 -168
- mplang/v1/ops/phe.py +0 -216
- mplang/v1/ops/spu.py +0 -151
- mplang/v1/ops/sql_cc.py +0 -303
- mplang/v1/ops/tee.py +0 -36
- mplang/v1/protos/v1alpha1/mpir_pb2.py +0 -63
- mplang/v1/protos/v1alpha1/mpir_pb2.pyi +0 -557
- mplang/v1/protos/v1alpha1/value_pb2.py +0 -34
- mplang/v1/protos/v1alpha1/value_pb2.pyi +0 -169
- mplang/v1/runtime/channel.py +0 -230
- mplang/v1/runtime/cli.py +0 -451
- mplang/v1/runtime/client.py +0 -456
- mplang/v1/runtime/communicator.py +0 -131
- mplang/v1/runtime/data_providers.py +0 -303
- mplang/v1/runtime/driver.py +0 -324
- mplang/v1/runtime/exceptions.py +0 -27
- mplang/v1/runtime/http_api.md +0 -56
- mplang/v1/runtime/link_comm.py +0 -196
- mplang/v1/runtime/server.py +0 -501
- mplang/v1/runtime/session.py +0 -270
- mplang/v1/runtime/simulation.py +0 -324
- mplang/v1/simp/__init__.py +0 -13
- mplang/v1/simp/api.py +0 -353
- mplang/v1/simp/mpi.py +0 -131
- mplang/v1/simp/party.py +0 -225
- mplang/v1/simp/random.py +0 -120
- mplang/v1/simp/smpc.py +0 -238
- mplang/v1/utils/__init__.py +0 -13
- mplang/v1/utils/crypto.py +0 -32
- mplang/v1/utils/spu_utils.py +0 -130
- mplang/v1/utils/table_utils.py +0 -185
- mplang/v2/__init__.py +0 -424
- mplang/v2/libs/mpc/psi/rr22.py +0 -344
- mplang_nightly-0.1.dev268.dist-info/RECORD +0 -180
- /mplang/{v2/backends → backends}/channel.py +0 -0
- /mplang/{v2/edsl → edsl}/README.md +0 -0
- /mplang/{v2/edsl → edsl}/registry.py +0 -0
- /mplang/{v2/kernels → kernels}/Makefile +0 -0
- /mplang/{v2/kernels → kernels}/__init__.py +0 -0
- /mplang/{v2/kernels → kernels}/gf128.cpp +0 -0
- /mplang/{v2/libs → libs}/device/cluster.py +0 -0
- /mplang/{v2/libs → libs}/mpc/analytics/__init__.py +0 -0
- /mplang/{v2/libs → libs}/mpc/analytics/groupby.md +0 -0
- /mplang/{v2/libs → libs}/mpc/common/constants.py +0 -0
- /mplang/{v2/libs → libs}/mpc/ot/__init__.py +0 -0
- /mplang/{v2/libs → libs}/mpc/psi/__init__.py +0 -0
- /mplang/{v2/libs → libs}/mpc/vole/__init__.py +0 -0
- /mplang/{v2/runtime → runtime}/__init__.py +0 -0
- /mplang/{v2/runtime → runtime}/dialect_state.py +0 -0
- /mplang/{v2/runtime → runtime}/object_store.py +0 -0
- {mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/WHEEL +0 -0
- {mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/entry_points.txt +0 -0
- {mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/licenses/LICENSE +0 -0
mplang/v2/libs/mpc/psi/rr22.py
DELETED
|
@@ -1,344 +0,0 @@
|
|
|
1
|
-
# Copyright 2025 Ant Group Co., Ltd.
|
|
2
|
-
#
|
|
3
|
-
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
-
# you may not use this file except in compliance with the License.
|
|
5
|
-
# You may obtain a copy of the License at
|
|
6
|
-
#
|
|
7
|
-
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
-
#
|
|
9
|
-
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
-
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
-
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
-
# See the License for the specific language governing permissions and
|
|
13
|
-
# limitations under the License.
|
|
14
|
-
|
|
15
|
-
"""Private Set Intersection using VOLE and OKVS (RR22-Style).
|
|
16
|
-
|
|
17
|
-
This module implements a high-performance PSI protocol based on the "Blazing Fast PSI"
|
|
18
|
-
(RR22) paper. The protocol relies on Vector Oblivious Linear Evaluation (VOLE) and
|
|
19
|
-
Oblivious Key-Value Stores (OKVS) to achieve efficient set intersection with linear
|
|
20
|
-
communication O(N) and computation complexity.
|
|
21
|
-
|
|
22
|
-
Protocol Overview:
|
|
23
|
-
The core idea is to mask a "Polynomial" (encoded via OKVS) with VOLE-correlated randomness,
|
|
24
|
-
such that the mask can only be removed (and the polynomial verified) if the parties share
|
|
25
|
-
the same element.
|
|
26
|
-
|
|
27
|
-
Phases:
|
|
28
|
-
1. **Correlated Randomness (VOLE)**:
|
|
29
|
-
Sender and Receiver establish a shared correlation:
|
|
30
|
-
W = V + U * Delta
|
|
31
|
-
- Sender holds U, V.
|
|
32
|
-
- Receiver holds W, Delta.
|
|
33
|
-
- U is random. Delta is a fixed secret scalar (Receiver's key).
|
|
34
|
-
|
|
35
|
-
2. **Encoding (OKVS)**:
|
|
36
|
-
Receiver encodes their input set Y into a structure P using OKVS, such that:
|
|
37
|
-
Decode(P, y) = H(y) for all y in Y.
|
|
38
|
-
Here H(y) is a Random Oracle (implemented via Davies-Meyer/AES).
|
|
39
|
-
|
|
40
|
-
3. **Masking & Exchange**:
|
|
41
|
-
Receiver masks the structure P with their VOLE share W:
|
|
42
|
-
Q = P ^ W
|
|
43
|
-
Receiver sends Q to Sender.
|
|
44
|
-
|
|
45
|
-
4. **Decoding & Verification**:
|
|
46
|
-
Sender attempts to decode Q for each of their items x in X.
|
|
47
|
-
Since OKVS is linear:
|
|
48
|
-
Decode(Q, x) = Decode(P, x) ^ Decode(W, x)
|
|
49
|
-
|
|
50
|
-
Sender reconstructs the potential "Target" value T:
|
|
51
|
-
T = Decode(Q, x) ^ Decode(V, x) ^ H(x)
|
|
52
|
-
|
|
53
|
-
If x in Y (Intersection):
|
|
54
|
-
Decode(P, x) = H(x)
|
|
55
|
-
Decode(W, x) = Decode(V, x) ^ Decode(U, x) * Delta
|
|
56
|
-
Substitute into T:
|
|
57
|
-
T = H(x) ^ (Decode(V, x) ^ Decode(U, x) * Delta) ^ Decode(V, x) ^ H(x)
|
|
58
|
-
T = Decode(U, x) * Delta
|
|
59
|
-
|
|
60
|
-
Thus, verification becomes checking if T == U* * Delta, where U* = Decode(U, x).
|
|
61
|
-
This check is performed securely using hashes to prevent leakage.
|
|
62
|
-
"""
|
|
63
|
-
|
|
64
|
-
from typing import Any, cast
|
|
65
|
-
|
|
66
|
-
import jax.numpy as jnp
|
|
67
|
-
|
|
68
|
-
import mplang.v2.edsl as el
|
|
69
|
-
import mplang.v2.libs.mpc.ot.silent as silent_ot
|
|
70
|
-
from mplang.v2.dialects import field, simp, tensor
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def psi_intersect(
|
|
74
|
-
sender: int,
|
|
75
|
-
receiver: int,
|
|
76
|
-
n: int,
|
|
77
|
-
sender_items: el.Object,
|
|
78
|
-
receiver_items: el.Object,
|
|
79
|
-
) -> el.Object:
|
|
80
|
-
"""Execute OKVS-based PSI Protocol.
|
|
81
|
-
|
|
82
|
-
Args:
|
|
83
|
-
sender: Rank of Sender.
|
|
84
|
-
receiver: Rank of Receiver.
|
|
85
|
-
n: Number of items (must be same for now).
|
|
86
|
-
sender_items: Object located at Sender containing (N,) u64 items.
|
|
87
|
-
receiver_items: Object located at Receiver containing (N,) u64 items.
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
Intersection verification tuple (T, U*, Delta).
|
|
91
|
-
"""
|
|
92
|
-
|
|
93
|
-
# Validation
|
|
94
|
-
if sender == receiver:
|
|
95
|
-
raise ValueError(
|
|
96
|
-
f"Sender ({sender}) and Receiver ({receiver}) must be different."
|
|
97
|
-
)
|
|
98
|
-
|
|
99
|
-
if n <= 0:
|
|
100
|
-
raise ValueError(f"Input size n must be positive, got {n}.")
|
|
101
|
-
|
|
102
|
-
# =========================================================================
|
|
103
|
-
# Phase 1. Parameter Setup & Topology
|
|
104
|
-
# =========================================================================
|
|
105
|
-
# OKVS Size M = expansion * N.
|
|
106
|
-
# The expansion factor is critical for the success probability of the "Peeling"
|
|
107
|
-
# algorithm used in OKVS encoding (Garbled Cuckoo Table).
|
|
108
|
-
# Larger N allows smaller expansion (closer to theoretical 1.23) while maintaining safety.
|
|
109
|
-
import mplang.v2.libs.mpc.psi.okvs_gct as okvs_gct
|
|
110
|
-
|
|
111
|
-
expansion = okvs_gct.get_okvs_expansion(n)
|
|
112
|
-
M = int(n * expansion)
|
|
113
|
-
|
|
114
|
-
# Align M to 128 boundary for efficient batch processing in Silent VOLE (LPN)
|
|
115
|
-
if M % 128 != 0:
|
|
116
|
-
M = ((M // 128) + 1) * 128
|
|
117
|
-
|
|
118
|
-
# =========================================================================
|
|
119
|
-
# Phase 2. Correlated Randomness Generation (VOLE)
|
|
120
|
-
# =========================================================================
|
|
121
|
-
# Parties run Silent VOLE (based on LPN assumption) to generate:
|
|
122
|
-
# Sender: U, V (Vectors of size M)
|
|
123
|
-
# Receiver: W, Delta
|
|
124
|
-
# Correlation: W = V + U * Delta
|
|
125
|
-
#
|
|
126
|
-
# Note: U is uniformly random. It acts as a "One-Time Pad" key for the protocol.
|
|
127
|
-
|
|
128
|
-
# silent_vole_random_u returns (v, w, u, delta)
|
|
129
|
-
res_tuple = silent_ot.silent_vole_random_u(sender, receiver, M, base_k=1024)
|
|
130
|
-
v_sender, w_receiver, u_sender, delta_receiver = res_tuple[:4]
|
|
131
|
-
|
|
132
|
-
# =========================================================================
|
|
133
|
-
# Phase 3. Receiver Encoding & Masking (OKVS)
|
|
134
|
-
# =========================================================================
|
|
135
|
-
# The Receiver encodes their input set Y into the OKVS structure P.
|
|
136
|
-
# Goal: Decode(P, y) = H(y) forall y in Y.
|
|
137
|
-
#
|
|
138
|
-
# Then, Receiver masks P with the VOLE output W to get Q:
|
|
139
|
-
# Q = P ^ W
|
|
140
|
-
# This Q is sent to the Sender.
|
|
141
|
-
|
|
142
|
-
# 3.1 Generate OKVS Seed (Public/Session Randomness)
|
|
143
|
-
# Used for OKVS hashing distribution. Can be public, but generated at runtime for safety.
|
|
144
|
-
from mplang.v2.dialects import crypto
|
|
145
|
-
from mplang.v2.edsl import typing as elt
|
|
146
|
-
|
|
147
|
-
def _gen_seed() -> Any:
|
|
148
|
-
return crypto.random_tensor((2,), elt.u64)
|
|
149
|
-
|
|
150
|
-
okvs_seed = simp.pcall_static((receiver,), _gen_seed)
|
|
151
|
-
okvs_seed_sender = simp.shuffle_static(okvs_seed, {sender: receiver})
|
|
152
|
-
|
|
153
|
-
# Instantiate OKVS Data Structure
|
|
154
|
-
okvs = okvs_gct.SparseOKVS(M)
|
|
155
|
-
|
|
156
|
-
def _recv_ops(y: Any, w: Any, delta: Any, seed: Any) -> Any:
|
|
157
|
-
# y: (N,) Inputs
|
|
158
|
-
# w: (M, 2) VOLE share
|
|
159
|
-
|
|
160
|
-
# 3.2 Compute H(y) - The Random Oracle Target
|
|
161
|
-
# We use Davies-Meyer construction: H(x) = E_x(0) ^ x
|
|
162
|
-
# This is a standard, efficient, and robust way to instantiate a RO from AES.
|
|
163
|
-
|
|
164
|
-
def _reshape_seeds(items: Any) -> Any:
|
|
165
|
-
# Prepare items as AES keys (128-bit)
|
|
166
|
-
lo = items
|
|
167
|
-
hi = jnp.zeros_like(items)
|
|
168
|
-
return jnp.stack([lo, hi], axis=1) # (N, 2)
|
|
169
|
-
|
|
170
|
-
seeds = tensor.run_jax(_reshape_seeds, y)
|
|
171
|
-
res_exp = field.aes_expand(seeds, 1) # (N, 1, 2)
|
|
172
|
-
|
|
173
|
-
def _davies_meyer(enc: Any, s: Any) -> Any:
|
|
174
|
-
enc_flat = enc.reshape(enc.shape[0], 2)
|
|
175
|
-
return jnp.bitwise_xor(enc_flat, s)
|
|
176
|
-
|
|
177
|
-
h_y = tensor.run_jax(_davies_meyer, res_exp, seeds)
|
|
178
|
-
|
|
179
|
-
# 3.3 Solve System of Linear Equations (OKVS Encode)
|
|
180
|
-
# We find P such that: P * M_okvs(y) = h_y
|
|
181
|
-
p_storage = okvs.encode(y, h_y, seed)
|
|
182
|
-
|
|
183
|
-
# 3.4 Mask with Vole Share
|
|
184
|
-
# Q = P ^ W
|
|
185
|
-
q_storage = field.add(p_storage, w)
|
|
186
|
-
|
|
187
|
-
return q_storage
|
|
188
|
-
|
|
189
|
-
# Execute on Receiver
|
|
190
|
-
q_shared = simp.pcall_static(
|
|
191
|
-
(receiver,), _recv_ops, receiver_items, w_receiver, delta_receiver, okvs_seed
|
|
192
|
-
)
|
|
193
|
-
|
|
194
|
-
# 3.5 Send Q to Sender
|
|
195
|
-
q_sender_view = simp.shuffle_static(q_shared, {sender: receiver})
|
|
196
|
-
|
|
197
|
-
# =========================================================================
|
|
198
|
-
# Phase 4. Sender Decoding & Reconstruction
|
|
199
|
-
# =========================================================================
|
|
200
|
-
# Sender uses Q and their local shares (U, V) to reconstruct T.
|
|
201
|
-
#
|
|
202
|
-
# Derivation:
|
|
203
|
-
# 1. S_decoded = Decode(Q, x) = Decode(P ^ W, x) = P(x) ^ W(x)
|
|
204
|
-
# 2. Recall W(x) = V(x) ^ U(x)*Delta (VOLE property)
|
|
205
|
-
# 3. So S_decoded = P(x) ^ V(x) ^ U(x)*Delta
|
|
206
|
-
#
|
|
207
|
-
# 4. Sender computes T = S_decoded ^ V(x) ^ H(x)
|
|
208
|
-
# T = P(x) ^ V(x) ^ U(x)*Delta ^ V(x) ^ H(x)
|
|
209
|
-
# T = P(x) ^ H(x) ^ U(x)*Delta
|
|
210
|
-
#
|
|
211
|
-
# 5. If x is in Intersection (Meanings x == y for some y):
|
|
212
|
-
# Then P(x) == H(x) (by OKVS property)
|
|
213
|
-
# So T = H(x) ^ H(x) ^ U(x)*Delta
|
|
214
|
-
# T = U(x)*Delta
|
|
215
|
-
#
|
|
216
|
-
# This relation T == U* * Delta is what we verify in Phase 5.
|
|
217
|
-
|
|
218
|
-
def _sender_ops(x: Any, q: Any, u: Any, v: Any, seed: Any) -> tuple[Any, Any]:
|
|
219
|
-
# x: (N,) Sender Items
|
|
220
|
-
# q: (M, 2) Received OKVS
|
|
221
|
-
|
|
222
|
-
# 4.1 Decode Q and V at x
|
|
223
|
-
# OKVS Decode is a linear combination of storage positions.
|
|
224
|
-
s_decoded = okvs.decode(x, q, seed)
|
|
225
|
-
v_decoded = okvs.decode(x, v, seed)
|
|
226
|
-
|
|
227
|
-
# 4.2 Compute H(x)
|
|
228
|
-
def _reshape_seeds(items: Any) -> Any:
|
|
229
|
-
lo = items
|
|
230
|
-
hi = jnp.zeros_like(items)
|
|
231
|
-
return jnp.stack([lo, hi], axis=1)
|
|
232
|
-
|
|
233
|
-
seeds_x = tensor.run_jax(_reshape_seeds, x)
|
|
234
|
-
res_exp_x = field.aes_expand(seeds_x, 1)
|
|
235
|
-
|
|
236
|
-
def _davies_meyer(enc: Any, s: Any) -> Any:
|
|
237
|
-
enc_flat = enc.reshape(enc.shape[0], 2)
|
|
238
|
-
return jnp.bitwise_xor(enc_flat, s)
|
|
239
|
-
|
|
240
|
-
h_x = tensor.run_jax(_davies_meyer, res_exp_x, seeds_x)
|
|
241
|
-
|
|
242
|
-
# 4.3 Compute T candidate
|
|
243
|
-
# T = S ^ V ^ H(x)
|
|
244
|
-
# Note: s_decoded is (S^V^U*Delta) effectively
|
|
245
|
-
t_val = field.add(s_decoded, v_decoded)
|
|
246
|
-
t_val = field.add(t_val, h_x)
|
|
247
|
-
|
|
248
|
-
# 4.4 Compute U* = Decode(U, x)
|
|
249
|
-
# This is the sender's share of the randomness for item x.
|
|
250
|
-
s_u = field.decode_okvs(x, u, seed)
|
|
251
|
-
|
|
252
|
-
return t_val, s_u
|
|
253
|
-
|
|
254
|
-
t_val_sender, u_star_sender = simp.pcall_static(
|
|
255
|
-
(sender,),
|
|
256
|
-
_sender_ops,
|
|
257
|
-
sender_items,
|
|
258
|
-
q_sender_view,
|
|
259
|
-
u_sender,
|
|
260
|
-
v_sender,
|
|
261
|
-
okvs_seed_sender,
|
|
262
|
-
)
|
|
263
|
-
|
|
264
|
-
# =========================================================================
|
|
265
|
-
# Phase 5. Secure Verification
|
|
266
|
-
# =========================================================================
|
|
267
|
-
# The Protocol invariant is T == U* * Delta for intersection items.
|
|
268
|
-
#
|
|
269
|
-
# Security Risk:
|
|
270
|
-
# We must NOT reveal T or Delta to the other party.
|
|
271
|
-
# - If Receiver learns T, they can compute Diff = T - U*Delta = H(x) + ... and attack x.
|
|
272
|
-
# - If Sender learns Delta, VOLE security collapses.
|
|
273
|
-
#
|
|
274
|
-
# Secure Verification Method:
|
|
275
|
-
# 1. Sender sends U* (Random Mask share) to Receiver.
|
|
276
|
-
# - U* is derived from U (random VOLE inputs) so it reveals nothing about X.
|
|
277
|
-
#
|
|
278
|
-
# 2. Receiver computes Target = U* * Delta.
|
|
279
|
-
# - This allows Receiver to construct the expected value of T without knowing T's components.
|
|
280
|
-
#
|
|
281
|
-
# 3. Receiver Hashes the Target and sends H(Target) to Sender.
|
|
282
|
-
# - Hashing prevents Sender from learning Delta algebraically.
|
|
283
|
-
# - Hash function acts as a commitment.
|
|
284
|
-
#
|
|
285
|
-
# 4. Sender compares H(T) =? H(Target).
|
|
286
|
-
# - Equality implies x is in Intersection.
|
|
287
|
-
|
|
288
|
-
# 5.1 Sender -> Receiver: U*
|
|
289
|
-
u_star_recv = simp.shuffle_static(u_star_sender, {receiver: sender})
|
|
290
|
-
|
|
291
|
-
# 5.2 Receiver: Compute Expected Target (U* * Delta)
|
|
292
|
-
def _recv_verify_ops(u_s: Any, delta: Any) -> Any:
|
|
293
|
-
# u_s: (N, 2), delta: (2,)
|
|
294
|
-
|
|
295
|
-
# Use tensor.run_jax to isolate JAX operations (tile is not an EDSL primitive)
|
|
296
|
-
def _tile(d: Any) -> Any:
|
|
297
|
-
return jnp.tile(d, (n, 1))
|
|
298
|
-
|
|
299
|
-
delta_expanded = tensor.run_jax(_tile, delta)
|
|
300
|
-
|
|
301
|
-
# Compute U* * Delta in GF(2^128)
|
|
302
|
-
target = field.mul(u_s, delta_expanded)
|
|
303
|
-
return target
|
|
304
|
-
|
|
305
|
-
target_val = simp.pcall_static(
|
|
306
|
-
(receiver,), _recv_verify_ops, u_star_recv, delta_receiver
|
|
307
|
-
)
|
|
308
|
-
|
|
309
|
-
# 5.3 Hash Exchange
|
|
310
|
-
# Use robust hashing to prevent algebraic attacks or leakage
|
|
311
|
-
from mplang.v2.libs.mpc.ot import extension as ot_extension
|
|
312
|
-
|
|
313
|
-
def _hash_shares(share: el.Object, party: int) -> el.Object:
|
|
314
|
-
"""Hash the shares using domain separator for security."""
|
|
315
|
-
return ot_extension.vec_hash(share, domain_sep=0xFEED, num_rows=n)
|
|
316
|
-
|
|
317
|
-
# Hash(Target) on Receiver
|
|
318
|
-
h_target_recv = simp.pcall_static(
|
|
319
|
-
(receiver,), lambda x: _hash_shares(x, receiver), target_val
|
|
320
|
-
)
|
|
321
|
-
|
|
322
|
-
# Hash(T) on Sender
|
|
323
|
-
h_t_sender = simp.pcall_static(
|
|
324
|
-
(sender,), lambda x: _hash_shares(x, sender), t_val_sender
|
|
325
|
-
)
|
|
326
|
-
|
|
327
|
-
# Send Hash to Sender for comparison
|
|
328
|
-
h_target_at_sender = simp.shuffle_static(h_target_recv, {sender: receiver})
|
|
329
|
-
|
|
330
|
-
# 5.4 Final Comparison on Sender
|
|
331
|
-
def _compare(h_t: Any, h_target: Any) -> Any:
|
|
332
|
-
# Compare 32-byte hashes (N, 32) row-by-row
|
|
333
|
-
|
|
334
|
-
def _core(a: Any, b: Any) -> Any:
|
|
335
|
-
eq = jnp.all(a == b, axis=1)
|
|
336
|
-
return eq.astype(jnp.uint8) # (N,) 0 or 1
|
|
337
|
-
|
|
338
|
-
return tensor.run_jax(_core, h_t, h_target)
|
|
339
|
-
|
|
340
|
-
intersection_mask = simp.pcall_static(
|
|
341
|
-
(sender,), _compare, h_t_sender, h_target_at_sender
|
|
342
|
-
)
|
|
343
|
-
|
|
344
|
-
return cast(el.Object, intersection_mask)
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
mplang/__init__.py,sha256=CdfWOdeg-I1q6ULjdBxeLioVlplA4bgPTSn_2xSk5VY,1677
|
|
2
|
-
mplang/py.typed,sha256=RyhZV7Yxo8BvEoBiFz5fH3IWVqQKTcBBE-bzjx_N5GQ,583
|
|
3
|
-
mplang/v1/__init__.py,sha256=m7UQeAqYwQOzFt-lYqv9eKs9kdvutW025pxEG0h7eVs,3346
|
|
4
|
-
mplang/v1/_device.py,sha256=MY4OO7TJr2oxDXbvv_pnBweALxP2wvV0cvq3DMLHFuE,22971
|
|
5
|
-
mplang/v1/host.py,sha256=-daviW1W4HYFhBqMzkDkJoQap8HxNDFDop2FyI_mrak,4306
|
|
6
|
-
mplang/v1/analysis/__init__.py,sha256=RvgCE9TO_cmwHtunlhbTbzCtLc19Ym7vlmVCL2UAqCs,1059
|
|
7
|
-
mplang/v1/analysis/diagram.py,sha256=XZgq1sq25xxnJF84WVkPDTmC90VVVaj8x6Annn_Ipu0,19477
|
|
8
|
-
mplang/v1/core/__init__.py,sha256=RN4SugeL-Wkfhrryx_Cf1T-Ax3Ol0zrqbCxAD4Wj3JA,3375
|
|
9
|
-
mplang/v1/core/cluster.py,sha256=d23L12eHoNDO17eojxbI4EhWi6GtUDzKbl-R6U5K580,12102
|
|
10
|
-
mplang/v1/core/comm.py,sha256=6kQ5lnyodys_Ls_6BIrNo3E3DMwsr2z5IPn-pYh2HZs,8976
|
|
11
|
-
mplang/v1/core/context_mgr.py,sha256=87BPy02UF7ZOPxPieSxMV_OSfXK4HJmnSFXKFaFSnwk,1544
|
|
12
|
-
mplang/v1/core/dtypes.py,sha256=ZTXcQfcy5rKJp7JEkmE4rqqki7LalbKOplQ1bkMqpgM,11613
|
|
13
|
-
mplang/v1/core/interp.py,sha256=iigeVh1mmdt9PL_1RRoNWYSFpYnAjEKol8qrJ8cfXO4,5933
|
|
14
|
-
mplang/v1/core/mask.py,sha256=14DFxaA446lGjN4dzTuQgm9Shcn34rYI87YJHg0YGNQ,10693
|
|
15
|
-
mplang/v1/core/mpir.py,sha256=CKmNiv6Q_tvxSvFcmeaYXPl67-eQiVhe9EIXT2LDU9M,38421
|
|
16
|
-
mplang/v1/core/mpobject.py,sha256=qSRGvJ-3Vy9LLBYWQCcTYVh2EUx-pMOkFkVIQYVUwOA,3751
|
|
17
|
-
mplang/v1/core/mptype.py,sha256=i6J2s355P4MkM0R2S5DY1aj8tzUMeoCMYEU72R2cRSo,13972
|
|
18
|
-
mplang/v1/core/pfunc.py,sha256=TZpa15qeSxqPMacCH8UXQARoRqiR96sLYsPpJ_QIY6I,5108
|
|
19
|
-
mplang/v1/core/primitive.py,sha256=x-GykjaNqZzGTO-zcGZiknH7UC5YBxIem-xvFo2Jvig,36772
|
|
20
|
-
mplang/v1/core/table.py,sha256=-KcFotbhcWC1P87JeYs0ho22Fk8wWrqoVkpU9HooFFo,6626
|
|
21
|
-
mplang/v1/core/tensor.py,sha256=PejvflIz40THE789ft4KJHp4i8l9cOSQxxJx7HiuLOA,2365
|
|
22
|
-
mplang/v1/core/tracer.py,sha256=FI5fUCEw6Qth_poCNgu8LCHkAUDrBUMwrNW0_evSx14,14315
|
|
23
|
-
mplang/v1/core/expr/__init__.py,sha256=pIjDsy-PYCK0Vx1r_Y0Q_vD2XaHAwTyNDan34dE5Fro,2009
|
|
24
|
-
mplang/v1/core/expr/ast.py,sha256=w54nL371KWMK92agCmG9Pnfn8VaiK8mV2lXPKu4ff5w,20893
|
|
25
|
-
mplang/v1/core/expr/evaluator.py,sha256=HuzHzr1e84ijohhutW4ND7spIl0O4cbvUlMsGW6oBY0,23337
|
|
26
|
-
mplang/v1/core/expr/printer.py,sha256=3IR65WaiQBm0ITWRThRAZWgGRi3xB2SCZA34MhcaVXU,9679
|
|
27
|
-
mplang/v1/core/expr/transformer.py,sha256=KPOGavPxWF8FksvVY6iYqyJnvcJumvb2KVUwdc9DQwc,4910
|
|
28
|
-
mplang/v1/core/expr/utils.py,sha256=lkIM1GB9qUF0x46xVe4UGyeJH8qSB0qN2FjDpWoiGiY,2631
|
|
29
|
-
mplang/v1/core/expr/visitor.py,sha256=C1UWZbMtTPGOpi62oaYRjO3kVqSRJcJWn1ZZw-gxLaA,2047
|
|
30
|
-
mplang/v1/core/expr/walk.py,sha256=zhP2X_wQVgx3rMFIcq5F0o3byZ2lLpTZQTarnCkYwD4,11892
|
|
31
|
-
mplang/v1/kernels/__init__.py,sha256=-bZWsXDC7qYkbHZh_7AvX8wQ1dnokj5LZhR5KpeKrWg,1055
|
|
32
|
-
mplang/v1/kernels/base.py,sha256=a01tsvZSnlP2C7bdphJLIQPMI1-yFankIWansqByVVg,3829
|
|
33
|
-
mplang/v1/kernels/basic.py,sha256=ZC5dRUEt4jXUwfPCQj4geaAX3RxO0x8SYvf2PPgVito,8881
|
|
34
|
-
mplang/v1/kernels/context.py,sha256=vvuwwLaO8iNDCXi_Riw1DqjZvIV8QIuZ3bBJlnAyNAA,14080
|
|
35
|
-
mplang/v1/kernels/crypto.py,sha256=YsfaCYnwRZYVvetnT28G9GdqCxC7TNyka77ctIWzjmY,4260
|
|
36
|
-
mplang/v1/kernels/fhe.py,sha256=FY-Gs2Kqa_xF_LOWLOuFL6BLcP9gdGxZOvcU5U8ktNs,30916
|
|
37
|
-
mplang/v1/kernels/mock_tee.py,sha256=5O6HIl-lXYsRPBwu19QHDxnzARdSj5dbl-enYqQF6mo,2495
|
|
38
|
-
mplang/v1/kernels/phe.py,sha256=OA8Fy_xRN5KavTzt7tR0E5XDavu2PsEcGpUr2jXmvd4,73156
|
|
39
|
-
mplang/v1/kernels/spu.py,sha256=FsZpIyM5FltxeCXRaVuavo2VJeG-O0zQ3YGALCH36zM,12492
|
|
40
|
-
mplang/v1/kernels/sql_duckdb.py,sha256=J4wBwmh0tu1GDf9r5S-hb-Cm7sLubUpAuU4LIVoU5Fs,1718
|
|
41
|
-
mplang/v1/kernels/stablehlo.py,sha256=9HzfqiqyK5XCHPe3AhNN0IT4QrIUoLS44R8OLHF-pT0,3217
|
|
42
|
-
mplang/v1/kernels/value.py,sha256=7yPdbSHHFhBx4mizrYLzubBLkN6GVTkpcCLjCZAtCgA,20723
|
|
43
|
-
mplang/v1/ops/__init__.py,sha256=EqwD85heDk4xxoqowQqnUTZGJ8UGhgDVAxtURBi-O3M,1018
|
|
44
|
-
mplang/v1/ops/base.py,sha256=kZcRprWiRNHs5eKeBqYLoSruo-qMcNhmkGaQw_2mPfc,18162
|
|
45
|
-
mplang/v1/ops/basic.py,sha256=DjsMYhtJ-B69bXBAI3znvC00p7v0GALOBgJD8Q3L0kc,9260
|
|
46
|
-
mplang/v1/ops/crypto.py,sha256=YJGzXz6sXjBB6xnu3moLsirZWlOkGSPy4M8cakpvbRs,8952
|
|
47
|
-
mplang/v1/ops/fhe.py,sha256=IHMUT7D6GRu-X-gunMK593_9N88Jf3njsLrKflvck08,9518
|
|
48
|
-
mplang/v1/ops/jax_cc.py,sha256=O3y3bQitMbr448Uzz4ha02Jr3GZ2FhjWfuOOVcnGECQ,6112
|
|
49
|
-
mplang/v1/ops/nnx_cc.py,sha256=LkP1qMkNoeheyonsdreXNDMgQepesOXv4AaJn0SU8Gs,7323
|
|
50
|
-
mplang/v1/ops/phe.py,sha256=UulFSKEohmk66h9L5rsl5F1xPlRKTRxS7jb88cyCsag,7421
|
|
51
|
-
mplang/v1/ops/spu.py,sha256=VjdNEGtGC5M8q8qn82lAuwkKiNPGQvOiJyXz52d7-Sw,4930
|
|
52
|
-
mplang/v1/ops/sql_cc.py,sha256=EifWv-L8szHt7_baxsN69wMzu-yZi_OEIPJHxjWIAtg,9792
|
|
53
|
-
mplang/v1/ops/tee.py,sha256=7-xCbsZiDKAtnUOQ-o65Fj2Y9nkG5nbgH2qzDOdRbhM,1251
|
|
54
|
-
mplang/v1/protos/v1alpha1/mpir_pb2.py,sha256=Bros37t-4LMJbuUYVSM65rImUYTtZDhNTIADGbZCKp0,7522
|
|
55
|
-
mplang/v1/protos/v1alpha1/mpir_pb2.pyi,sha256=dLxAtFW7mgFR-HYxC4ExI4jbtEWUGTKBvcKhI3BJ8m0,20972
|
|
56
|
-
mplang/v1/protos/v1alpha1/value_pb2.py,sha256=V9fqQTqXNo2efYmlP9xOhC7EpjBUp5jL-05yrJsAvWU,2785
|
|
57
|
-
mplang/v1/protos/v1alpha1/value_pb2.pyi,sha256=47GVvuZfiV5oaVemwh0xTfns8OYTVBT8YnluIQeQPbs,7108
|
|
58
|
-
mplang/v1/runtime/__init__.py,sha256=if0QGJEJMw8PkNyxghzxOdWlNJOEE3UZUnkqU3q2Znc,954
|
|
59
|
-
mplang/v1/runtime/channel.py,sha256=yfy-sI8nQJkINePnzYLtOs2bg7vYqC412uyjrSeDet8,7583
|
|
60
|
-
mplang/v1/runtime/cli.py,sha256=xbnWqYoU35qJjgCk2M8dBg7hU1QqM7nKWbEKCKa_cz4,15343
|
|
61
|
-
mplang/v1/runtime/client.py,sha256=FsKXrBcI0AQmGmwX7BhIhtTNFRmEhTyfNk2ruitf2Gg,15861
|
|
62
|
-
mplang/v1/runtime/communicator.py,sha256=HukrYfnUihN4WfuURCKF8OF3vzelueGgMUEZGDMyhjE,5074
|
|
63
|
-
mplang/v1/runtime/data_providers.py,sha256=DCj-QqVAGf9jNInPoJS9KjsfF79OZXSDT9IRytseH4E,10633
|
|
64
|
-
mplang/v1/runtime/driver.py,sha256=2GONsWJG_USYXiqJMzHJkTwVCsJnsk9vu8bKuRQNk6g,11614
|
|
65
|
-
mplang/v1/runtime/exceptions.py,sha256=c18U0xK20dRmgZo0ogTf5vXlkix9y3VAFuzkHxaXPEk,981
|
|
66
|
-
mplang/v1/runtime/http_api.md,sha256=-re1DhEqMplAkv_wnqEU-PSs8tTzf4-Ml0Gq0f3Go6s,4883
|
|
67
|
-
mplang/v1/runtime/link_comm.py,sha256=4WMq-MTaXe5CboVV_HABxq_o2p863bOXg-E3vy4tKwU,6808
|
|
68
|
-
mplang/v1/runtime/server.py,sha256=1KSgwT0Lm1NNL_sLTf9Rr7EoIsN-gHARfs_h8dzdnLM,16997
|
|
69
|
-
mplang/v1/runtime/session.py,sha256=-H9W4yRatLC_feOFAorXQbR5vb1imkNoefWwjKUe4-k,9648
|
|
70
|
-
mplang/v1/runtime/simulation.py,sha256=S8_v6aHVzx3OI4w-VYLW3CmCjJslViBDPn5sVYcsOsQ,12179
|
|
71
|
-
mplang/v1/simp/__init__.py,sha256=2WE4cmW96Xkzyq2yRRYNww4kZ5o6u6NbPV0BxqZG698,581
|
|
72
|
-
mplang/v1/simp/api.py,sha256=X-NePnIoUfVpumYiffwNGIXnCXZ6zWzwSUmNju_fAbo,13906
|
|
73
|
-
mplang/v1/simp/mpi.py,sha256=EAVWH8vLSkXrobmgyNUrwbHqzL4F8wufoKQmTzXCR28,4751
|
|
74
|
-
mplang/v1/simp/party.py,sha256=_3cj6GctFzzex5_vOjsRrtOybxI9ekXFztfAy5OnOJw,8226
|
|
75
|
-
mplang/v1/simp/random.py,sha256=X1_IzA8C-Rt6bez4oJzTExW5XOKg_EIKlzXf1yJArt4,3843
|
|
76
|
-
mplang/v1/simp/smpc.py,sha256=JGB3zFkDyPcg-TdN77oxMfeiWNoxHkuZNpVoTO9me5Q,9267
|
|
77
|
-
mplang/v1/utils/__init__.py,sha256=2WE4cmW96Xkzyq2yRRYNww4kZ5o6u6NbPV0BxqZG698,581
|
|
78
|
-
mplang/v1/utils/crypto.py,sha256=rvPomBFtznRHc3RPi6Aip9lsU8zW2oxBqGv1K3vn7Rs,1052
|
|
79
|
-
mplang/v1/utils/func_utils.py,sha256=vCJcZmu0bEbqhOQKdpttV2_MBllIcPSN0b8U4WjNGGo,5164
|
|
80
|
-
mplang/v1/utils/spu_utils.py,sha256=S3L9RBkBe2AvSuMSQQ12cBY5Y1NPthubvErSX_7nj1A,4158
|
|
81
|
-
mplang/v1/utils/table_utils.py,sha256=1fDgZLrRf2bvKvA45egT6RtMPgwE1cI2BokMHUU_xv4,5945
|
|
82
|
-
mplang/v2/__init__.py,sha256=rX_DXuAu8IG_2-toMWtLB3UL0YDvXCPoxNoekVmhJG0,13837
|
|
83
|
-
mplang/v2/cli.py,sha256=QtiTFG418k26opRy4GhVV8fwFqRS11xTLH3xRCIIm6M,19665
|
|
84
|
-
mplang/v2/cli_guide.md,sha256=kyoCaqkvIJJ1vsvCyBu3qgOuRSb0txu9BDZoy9GU5S0,3617
|
|
85
|
-
mplang/v2/backends/__init__.py,sha256=H-4-jBEPWBZl6XT7AxBShRINnruF_f_2lB4iaiQoXME,1988
|
|
86
|
-
mplang/v2/backends/bfv_impl.py,sha256=cQPinze3c2xN4CmIIoXxZoIEhu9ynoGaXbdF95z_aTE,25709
|
|
87
|
-
mplang/v2/backends/channel.py,sha256=t8P7RphNnhvo3Zj08hX85d7PxgWQXiMGNYfZPK_4YoM,6622
|
|
88
|
-
mplang/v2/backends/crypto_impl.py,sha256=tU0KdI34hnYvYujKUkiA1XYpvy4lo_MKpidt0NSIKlk,23205
|
|
89
|
-
mplang/v2/backends/field_impl.py,sha256=50sKGOlkUiaTj_IAola86uQeoi-fxV0o7G91BdTCWZA,14788
|
|
90
|
-
mplang/v2/backends/func_impl.py,sha256=R0662cC0gSSfkjuLyevJ_g4bJDJirY76LTFYqEimCkE,3585
|
|
91
|
-
mplang/v2/backends/phe_impl.py,sha256=r836e_qBHGrHhfnFail5IaUDzvS7bABjdEQmJmAtBVI,4127
|
|
92
|
-
mplang/v2/backends/simp_design.md,sha256=CXvfxrvV1TmKlFm8IbKTbcHHwLl6AhwlY_cNqMdff_Y,5250
|
|
93
|
-
mplang/v2/backends/spu_impl.py,sha256=8F4oXmVEr-lt9mrT5fdNznrJZeznwOd7CrmB0-dVtx8,9475
|
|
94
|
-
mplang/v2/backends/spu_state.py,sha256=u84hgLhcCcpKvseXwtVa2hC9fj_HrLCVNHy6LMd37rE,6569
|
|
95
|
-
mplang/v2/backends/store_impl.py,sha256=RyhADTNsnnNnwsatAMr7eeewXkVXtfNWA1oFiLXg8H0,2222
|
|
96
|
-
mplang/v2/backends/table_impl.py,sha256=Qmd-Z_PLjSbDngWkHz0wc6VykoGHfS2-rCOk1aWudws,27566
|
|
97
|
-
mplang/v2/backends/tee_impl.py,sha256=Gp-vqqJPtEMNqP7y68tLhL3a-EW3BQwpo_qCJOSHqKs,7044
|
|
98
|
-
mplang/v2/backends/tensor_impl.py,sha256=8f9f4-_e-m4JWGZSbXLmSSHcgPykRBc1sAYrA3OIxEg,18906
|
|
99
|
-
mplang/v2/backends/simp_driver/__init__.py,sha256=ahOPYYvtFVwqxiFxkpSNP8BCTao_MfCXmtt5zsMaJxg,1258
|
|
100
|
-
mplang/v2/backends/simp_driver/http.py,sha256=Fm0M7BKf6Ddqec79btd-tJiuVaD92yghr1GJc84RXmg,5550
|
|
101
|
-
mplang/v2/backends/simp_driver/mem.py,sha256=kx3jDAYx3QkJa1UZDhhY_JjJAdT8u-r6Hsw8fYwFPKY,9128
|
|
102
|
-
mplang/v2/backends/simp_driver/ops.py,sha256=UeVC3eaCUwxrkN6OsJyMYj8qMDufMFQI0YogeSbhkjM,4515
|
|
103
|
-
mplang/v2/backends/simp_driver/state.py,sha256=6tQyQg_PNzHOJkjCoNm51Wvknl3XiJZzpQXuRB4qRtM,1719
|
|
104
|
-
mplang/v2/backends/simp_driver/values.py,sha256=OQ_7Kt6l7Pcfx5eB6GVbpunS6CG60Lj0AS6H9Wx9sKQ,1515
|
|
105
|
-
mplang/v2/backends/simp_worker/__init__.py,sha256=93VMzntLN1kpePK1KoLsU3J3RU-krgV3smCRRRo-xKA,970
|
|
106
|
-
mplang/v2/backends/simp_worker/http.py,sha256=HI4Kj8tsN8Z058m9D_8cU22d37VzQTlN4PW7d30dxSE,12656
|
|
107
|
-
mplang/v2/backends/simp_worker/mem.py,sha256=coDvztNDLlflCh2oGNuO0PSMILKZ28Fvyfhks4Vsnzc,3577
|
|
108
|
-
mplang/v2/backends/simp_worker/ops.py,sha256=DMQCsKeoMtemy5ozsVZt2eoF8NZlhLeHZMDgnBSP29I,5525
|
|
109
|
-
mplang/v2/backends/simp_worker/state.py,sha256=eRUI7MP6gU8KPC9-H5fwcoAPKOsfW2ODWvpoKWbecMk,1554
|
|
110
|
-
mplang/v2/dialects/__init__.py,sha256=hvzAvz6_brfFyDGgKknoPdgh5EY033YNYwotuJK_zoA,1493
|
|
111
|
-
mplang/v2/dialects/bfv.py,sha256=XrE3FX9DHWqNzUVzY0tuwPvNVVRZYpD51JZIZF-q-l4,22350
|
|
112
|
-
mplang/v2/dialects/crypto.py,sha256=dH_DtoE3pGAKeOLPHxeyGtXC-nGwBsOs62TKikJEaq0,22197
|
|
113
|
-
mplang/v2/dialects/dtypes.py,sha256=bGM3Jna3BnvE4MPOurWrEmQegGPxd26z1HIWox1rj0U,12104
|
|
114
|
-
mplang/v2/dialects/field.py,sha256=6nBJg08k5WHb2o5msr8XAnxMQLpoTej55VQ7iSRnC4o,6380
|
|
115
|
-
mplang/v2/dialects/func.py,sha256=UlaMof4NEG28VOtiRL7zBRYgFbIX74YTqqgvozbils0,4375
|
|
116
|
-
mplang/v2/dialects/phe.py,sha256=PkehfF2NVBOu05zXITZ87yl-YQa4hwLs7zmUPbk2XhY,22896
|
|
117
|
-
mplang/v2/dialects/simp.py,sha256=ON7iegkHp3um5UX8V4Y5I-fGgFJ3YVwmFsXsleiqqUE,32869
|
|
118
|
-
mplang/v2/dialects/spu.py,sha256=3JO-D394TKNH2VdFDRp5ohmG0uOcOHEs_ivFHbMZIgA,11385
|
|
119
|
-
mplang/v2/dialects/store.py,sha256=RqUBzMAgtEMBmdT8axV5lVCv1hp5w0ZZM0Tu4iOZt-c,2114
|
|
120
|
-
mplang/v2/dialects/table.py,sha256=jwNKHhpTRnpZVu_UhXGHKRAV0ekI8nXl5lLHa5PpxTE,13543
|
|
121
|
-
mplang/v2/dialects/tee.py,sha256=oj_G8ebhtuz9_HarK8rKoaJNJ9ZkRbqcIxhp3m0xsjQ,10129
|
|
122
|
-
mplang/v2/dialects/tensor.py,sha256=VVIlWtSHpeYFwGuKw7yWxwMQ_a35XJ-2ardeBed2HL8,39900
|
|
123
|
-
mplang/v2/edsl/README.md,sha256=viflvdRojOa6Xk_UMRPqpuPGXcPGmdlv2-XR6LO7B58,7592
|
|
124
|
-
mplang/v2/edsl/__init__.py,sha256=YqmtrJXD1NLKS-_Ofnxtiv77muokTZnrAiV7dXUZVyo,2607
|
|
125
|
-
mplang/v2/edsl/context.py,sha256=0RgQAt7cbPudt9kyBb7wjZ31HzGMnq81Ah5sgs_qU2U,10093
|
|
126
|
-
mplang/v2/edsl/graph.py,sha256=VXeE_9Oc9E0qfnwFDYBvFyDL79qvABLs1aFC-lheJ8M,14983
|
|
127
|
-
mplang/v2/edsl/jit.py,sha256=tofGAqNSUPuEmqy0flaZpNaR1Y425Pk2FdmCKxRPCM8,2069
|
|
128
|
-
mplang/v2/edsl/object.py,sha256=rijDu4yuG_Sitgfz5gk8-mJ1-3Bgor0QrQU04q9mkgo,1909
|
|
129
|
-
mplang/v2/edsl/primitive.py,sha256=rkKGYDa8qEOr2EmVn7GTfsCGHWL_3N-eIgD7QJ4UIW8,10575
|
|
130
|
-
mplang/v2/edsl/printer.py,sha256=x9vjhicqLvtZcrCkqQhF8QWAcvEArgyU6aqVLB9Ym2I,4396
|
|
131
|
-
mplang/v2/edsl/registry.py,sha256=hudXZPUrUUueEwgksDKN0cnE3iiXucuTaDdDK8uSPmk,6822
|
|
132
|
-
mplang/v2/edsl/serde.py,sha256=AKfryPMu9TiOqzkp5csck-wDHfksOgJEbndcH6tS6l0,11644
|
|
133
|
-
mplang/v2/edsl/tracer.py,sha256=HGrduMkEH8Cov19xCXmurVe46IMBjqdFxVP6C0zDoYI,22549
|
|
134
|
-
mplang/v2/edsl/typing.py,sha256=Ot2P8RNxVsE_sgsAFEPlH4l3MeVk3xrq0if6_8jf1nI,29290
|
|
135
|
-
mplang/v2/kernels/Makefile,sha256=5PoPpajcb_8ByPGNHzVytmovXUwkjJs_K8MbXX9qDYs,1033
|
|
136
|
-
mplang/v2/kernels/__init__.py,sha256=J_rDl9lAXd7QL3Nt_P3YX6j9yge7ssguSaHuafPZNKE,876
|
|
137
|
-
mplang/v2/kernels/gf128.cpp,sha256=WIvCr3MijzwJxMi1Wnfhm8aWT8oL0fia6FeyTmFJtPQ,5975
|
|
138
|
-
mplang/v2/kernels/ldpc.cpp,sha256=_zE90ZHQvrweRkBB3CEu80cXKG0a-QNJ59ZQ452gml8,2654
|
|
139
|
-
mplang/v2/kernels/okvs.cpp,sha256=Z_7oGHFAdLc5d5llUNujBO8HwDBh5yd3MpfmT8ZNf1o,10347
|
|
140
|
-
mplang/v2/kernels/okvs_opt.cpp,sha256=d_HhvMdcebYsG2x7kYzjuFgmEsh9WKLH6SHee3375Bg,10932
|
|
141
|
-
mplang/v2/kernels/py_kernels.py,sha256=FDsD86IHV-UBzxZLolhSOkrp24PuboHXeb1gBHLOfMo,12073
|
|
142
|
-
mplang/v2/libs/collective.py,sha256=pfXq9tmFUNKjeHhWMTjtzOi-m2Fn1lLru1G6txZVyic,10683
|
|
143
|
-
mplang/v2/libs/device/__init__.py,sha256=mXsSvXrWmlHu6Ch87Vcd85m4L_qdDkbSvJyHyuai2fc,1251
|
|
144
|
-
mplang/v2/libs/device/api.py,sha256=d_Wbka8bxxXsRMW6zDhjzL9LPtChSk2-ryfi-c4Mqsk,28830
|
|
145
|
-
mplang/v2/libs/device/cluster.py,sha256=YUqYZ_IBS6rpV5ejUFP3kTxcTQHSyeDeuaJcsiFY_Js,12508
|
|
146
|
-
mplang/v2/libs/ml/__init__.py,sha256=xTxhC_YwHP32muUEFCEwOjc-3Ml-vmO48NNECU90zm4,787
|
|
147
|
-
mplang/v2/libs/ml/sgb.py,sha256=T6GF9kYMHvuoffB567UlcwDoDCJ2SH7vttAABmgdmvU,60223
|
|
148
|
-
mplang/v2/libs/mpc/__init__.py,sha256=znADXBv0cATTvNN9pVOH8V47O5vmYZnR1Y7tfh1QVjw,1405
|
|
149
|
-
mplang/v2/libs/mpc/_utils.py,sha256=Xzt5jIQSm2e8_xFC6zrdKL93IqbTDb40apk2JBbEgBI,3215
|
|
150
|
-
mplang/v2/libs/mpc/analytics/__init__.py,sha256=8_1Sm05nrO2ISat1hNZT6UXHpKQ-SDBby1eeS-wm_fE,1204
|
|
151
|
-
mplang/v2/libs/mpc/analytics/aggregation.py,sha256=VPWwfcSV1kryG6EthjhOysh1RxH8xYczKnI_f7fmEgo,11648
|
|
152
|
-
mplang/v2/libs/mpc/analytics/groupby.md,sha256=_3oCouzGKlWt3OBMIFkhN25gyzJj6DlGpq-B78_PSlU,4679
|
|
153
|
-
mplang/v2/libs/mpc/analytics/groupby.py,sha256=3xXHYewJe28uu7BY1IwtsggKbU32LZkT81UZd67lmo4,11318
|
|
154
|
-
mplang/v2/libs/mpc/analytics/permutation.py,sha256=B-m9JtIMMc23C0AwfH_Yg5IF2XUIaMDT2IHluMNiiOM,13820
|
|
155
|
-
mplang/v2/libs/mpc/common/constants.py,sha256=YRRE8WkLGfdOZzicc976hPsPeZZkqho3aW41i5Mj72s,1316
|
|
156
|
-
mplang/v2/libs/mpc/ot/__init__.py,sha256=9Ivef7QnAzoCBtIohh2kzOSdfslcNftOwKV_d9Qv4z0,951
|
|
157
|
-
mplang/v2/libs/mpc/ot/base.py,sha256=J7jK8jwhXVlNIkIO9l7ZIRTPMYEDsuUQjP00nwPkMrs,7018
|
|
158
|
-
mplang/v2/libs/mpc/ot/extension.py,sha256=Z2br1HUin_wmosNPskx9o0bVGR5TF_pUIyp7lz7vPDI,17458
|
|
159
|
-
mplang/v2/libs/mpc/ot/silent.py,sha256=9J3sMsz3XzxPbIk91IpfAvvdGeZw-Tt0kElyPsNlnac,7879
|
|
160
|
-
mplang/v2/libs/mpc/psi/__init__.py,sha256=mpevlx3Z5_u9Q1McDZBBIGHApeO9julgiM09GToxxEA,1231
|
|
161
|
-
mplang/v2/libs/mpc/psi/cuckoo.py,sha256=GQvLi7BtaPZyk96xwVCwpQPGlcGhOUX6kdsEn8P80l0,7752
|
|
162
|
-
mplang/v2/libs/mpc/psi/okvs.py,sha256=a1Q4ILrsLII9K-BJRSX8iKkpkxJsMxFEj7cTId-XGCE,1576
|
|
163
|
-
mplang/v2/libs/mpc/psi/okvs_gct.py,sha256=wRxBEZw-dnYXHWng-1eRsnnP6k6wKySSUxigN9eq08k,3023
|
|
164
|
-
mplang/v2/libs/mpc/psi/oprf.py,sha256=YXD-I9P3t1YuqHVxOD9JUpLTZUu-HjgvOaEOQ3hhxMM,13772
|
|
165
|
-
mplang/v2/libs/mpc/psi/rr22.py,sha256=2mN1zbjrBUgaWCsF3Lj8ohtK6gcG95PtBb3EseS-Nsg,12614
|
|
166
|
-
mplang/v2/libs/mpc/psi/unbalanced.py,sha256=hC84TVsgnlJDg6hpUrx8kbUbmFb27T9wrHG0zv3FXLc,7433
|
|
167
|
-
mplang/v2/libs/mpc/vole/__init__.py,sha256=2dU4X6n73HoK-YCiCl4b36SkLRKR6rofe2xxLxBz6Rc,968
|
|
168
|
-
mplang/v2/libs/mpc/vole/gilboa.py,sha256=apnKOYR4_dJ2wkzGq7PBlwauA-W5i5MPESdetCWTegU,9951
|
|
169
|
-
mplang/v2/libs/mpc/vole/ldpc.py,sha256=1H_Dz1xdZTN2f3V6lz9NKBaY-How9Qu1GgwN0IJZero,12786
|
|
170
|
-
mplang/v2/libs/mpc/vole/silver.py,sha256=Qnk3EiA18i6RJl-iDCMHOwNdf0Zvkmxq_57O3Y0HPFw,12236
|
|
171
|
-
mplang/v2/runtime/__init__.py,sha256=VdUwJ3kDaI46FvGw7iMGwcsjt0HTGmmRmaBwj99xKIw,620
|
|
172
|
-
mplang/v2/runtime/dialect_state.py,sha256=HxO1i4kSOujS2tQzAF9-WmI3nChSaGgupf2_07dHetY,1277
|
|
173
|
-
mplang/v2/runtime/interpreter.py,sha256=UzrM5oepka6H0YKRZncNXhsuwKVm4pliG5J92fFRZMI,32300
|
|
174
|
-
mplang/v2/runtime/object_store.py,sha256=yT6jtKG2GUEJVmpq3gnQ8mCMvUFYzgBciC5A-J5KRdk,5998
|
|
175
|
-
mplang/v2/runtime/value.py,sha256=CMOxElJP78v7pjasPhEpbxWbSgB2KsLbpPmzz0mQX0E,4317
|
|
176
|
-
mplang_nightly-0.1.dev268.dist-info/METADATA,sha256=pIMljunrFh1RJ_3JlBim3jyAGc2GBkuXPwZH2LWfTlY,16775
|
|
177
|
-
mplang_nightly-0.1.dev268.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
|
|
178
|
-
mplang_nightly-0.1.dev268.dist-info/entry_points.txt,sha256=mG1oJT-GAjQR834a62_QIWb7litzWPPyVnwFqm-rWuY,55
|
|
179
|
-
mplang_nightly-0.1.dev268.dist-info/licenses/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
180
|
-
mplang_nightly-0.1.dev268.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{mplang_nightly-0.1.dev268.dist-info → mplang_nightly-0.1.dev270.dist-info}/licenses/LICENSE
RENAMED
|
File without changes
|