def prss_share_bit_double(self, field): """Share a random bit over *field* and GF256. The protocol is described in "Efficient Conversion of Secret-shared Values Between Different Fields" by Ivan Damgård and Rune Thorbek available as `Cryptology ePrint Archive, Report 2008/221 <http://eprint.iacr.org/2008/221>`__. """ n = self.num_players k = self.options.security_parameter prfs = self.players[self.id].prfs(2**k) prss_key = self.prss_key() b_p = self.prss_share_random(field, binary=True) r_p, r_lsb = prss_lsb(n, self.id, field, prfs, prss_key) b = self.open(b_p + r_p) # Extract least significant bit and change field to GF256. b.addCallback(lambda i: GF256(i.value & 1)) b.field = GF256 # Use r_lsb to flip b as needed. return (b_p, b ^ r_lsb)
def test_prss_lsb(self): (share, bit) = prss.prss_lsb(None, None, self.field, None, None) self.assertEquals(share, self.field(7)) self.assertEquals(bit, GF256(1))