Exemple #1
0
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
Exemple #3
0
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