def send()

in crypten/mpc/primitives/ot/baseOT.py [0:0]


    def send(self, message0s: List[str], message1s: List[str]):
        """
        sender's input is two message lists
        """
        if len(message0s) != len(message1s):
            raise ("inconsistent input size!")

        alphas = []
        masks_for_message1s = []
        for _i in range(len(message1s)):
            # pick a random element from Z_p
            alpha = random.randint(0, self.__prime - 1)
            alphas.append(alpha)

            # g^\alpha
            mask_for_message1 = pow(self.__generator, alpha, self.__prime)
            masks_for_message1s.append(mask_for_message1)

        # send mask_for_message1
        for i in range(len(message1s)):
            comm.get().send_obj(masks_for_message1s[i], self.partner_rank)

        # compute (g^\alpha)^-\alpha when waiting for response
        # (g^-1)^(\alpha^2) = (g^-1)^(\alpha^2 mod (p-1))
        dividers = []
        for i in range(len(message1s)):
            divider = pow(
                self.__inverse__generator,
                alphas[i] * alphas[i] % (self.__prime - 1),
                self.__prime,
            )
            dividers.append(divider)

        masks_for_choices = []

        # recv mask_for_choice
        for _i in range(len(message1s)):
            mask_for_choice = comm.get().recv_obj(self.partner_rank)
            masks_for_choices.append(mask_for_choice)

        for i in range(len(message1s)):
            masks_for_choices[i] = pow(masks_for_choices[i], alphas[i], self.__prime)

            # hash
            pad0 = sha256(str(masks_for_choices[i]).encode("utf-8")).hexdigest()
            pad1 = sha256(
                str(masks_for_choices[i] * dividers[i] % self.__prime).encode("utf-8")
            ).hexdigest()

            if len(pad0) < len(message0s[i]):
                raise (str(i) + "-th message0 is too long")
            if len(pad1) < len(message1s[i]):
                raise (str(i) + "-th message1 is too long")
            # encrypt with one time pad
            message0_enc = self.string_xor(pad0, message0s[i])
            message1_enc = self.string_xor(pad1, message1s[i])

            # send message0, message1
            comm.get().send_obj(message0_enc, self.partner_rank)
            comm.get().send_obj(message1_enc, self.partner_rank)