def protobuf_session_deserializer(proto: MPCSession_PB) -> Session: id_session = UUID(bytes=proto.uuid) rank = proto.rank conf_dict = Dict._proto2object(proto=proto.config) _conf_dict = {key: value for key, value in conf_dict.items()} conf = Config(**_conf_dict) ring_size = int.from_bytes(proto.ring_size, "big") nr_parties = int.from_bytes(proto.nr_parties, "big") protocol_deserialized = proto.protocol.decode() session = Session( config=conf, uuid=id_session, ring_size=ring_size, protocol=protocol_deserialized, ) session.rank = rank session.crypto_store = CryptoStore() session.nr_parties = nr_parties if "session" in globals(): warning("Overwritting session for MPC") globals()["session"] = session return session
def sanity_checks( x: "ReplicatedSharedTensor", y: Union[int, float, torch.Tensor, "ReplicatedSharedTensor"], ) -> "ReplicatedSharedTensor": """Check the type of "y" and convert it to share if necessary. Args: x (ReplicatedSharedTensor): Typically "self". y (Union[int, float, torch.Tensor, "ReplicatedSharedTensor"]): Tensor to check. Returns: ReplicatedSharedTensor: the converted y value. Raises: ValueError: if both values are shares and they have different uuids ValueError: if both values have different number of shares. ValueError: if both RSTensor have different ring_sizes """ if not isinstance(y, ReplicatedSharedTensor): # As prime ring size is unsigned,we convert negative values. y = y % PRIME_NUMBER if x.ring_size == PRIME_NUMBER else y y = ReplicatedSharedTensor( session_uuid=x.session_uuid, shares=[y], ring_size=x.ring_size, config=x.config, ) elif y.session_uuid and x.session_uuid and y.session_uuid != x.session_uuid: raise ValueError( f"Session UUIDs did not match {x.session_uuid} {y.session_uuid}" ) elif len(x.shares) != len(y.shares): raise ValueError( f"Both RSTensors should have equal number of shares {len(x.shares)} {len(y.shares)}" ) elif x.ring_size != y.ring_size: raise ValueError( f"Both RSTensors should have same ring_size {x.ring_size} {y.ring_size}" ) session_uuid = x.session_uuid if session_uuid is not None: session = sympc.session.get_session(str(x.session_uuid)) else: session = Session(config=x.config, ring_size=x.ring_size) session.nr_parties = 1 return y, session
def protobuf_session_deserializer(proto: MPCSession_PB) -> Session: id_session: Optional[str] = None if proto.uuid: id_session = proto.uuid saved_session = sympc.session.get_session(id_session) if saved_session and id_session == str(saved_session.uuid): return saved_session rank = proto.rank conf_dict = Dict._proto2object(proto=proto.config) _conf_dict = {key: value for key, value in conf_dict.items()} conf = Config(**_conf_dict) ring_size = int.from_bytes(proto.ring_size, "big") nr_parties = int.from_bytes(proto.nr_parties, "big") protocol_deserialized = Protocol.registered_protocols[ proto.protocol.name]() protocol_deserialized.security_type = proto.protocol.security_type session = Session( config=conf, ring_size=ring_size, protocol=protocol_deserialized, ) session.rank = rank session.crypto_store = CryptoStore() session.nr_parties = nr_parties if id_session is not None: session.uuid = UUID(id_session) if saved_session and id_session != str(saved_session.uuid): warning("Changing already set session") sympc.session.set_session(session) return session