async def test_hbavss_batch_batch_gf(test_router): t = 2 n = 3 * t + 1 g, h, pks, sks = get_avss_params(n, t) sends, recvs, _ = test_router(n) crs = gen_pc_const_crs(t, g=g, h=h) field = GF(Subgroup.BLS12_381) values = [field.random() for _ in range(50)] avss_tasks = [None] * n dealer_id = randint(0, n - 1) shares = [None] * n with ExitStack() as stack: hbavss_list = [None] * n for i in range(n): hbavss = HbAvssBatch(pks, sks[i], crs, n, t, i, sends[i], recvs[i], field=field) hbavss_list[i] = hbavss stack.enter_context(hbavss) if i == dealer_id: avss_tasks[i] = asyncio.create_task( hbavss.avss(0, values=values)) else: avss_tasks[i] = asyncio.create_task( hbavss.avss(0, dealer_id=dealer_id)) avss_tasks[i].add_done_callback(print_exception_callback) outputs = await asyncio.gather( *[hbavss_list[i].output_queue.get() for i in range(n)]) shares = [output[2] for output in outputs] for task in avss_tasks: task.cancel() fliped_shares = list(map(list, zip(*shares))) recovered_values = [] for item in fliped_shares: recovered_values.append( polynomials_over(field).interpolate_at(zip(range(1, n + 1), item))) assert recovered_values == values
async def hbavss_multibatch(test_router, params): (t, n, g, h, pks, sks, crs, pc, values, field) = params sends, recvs, _ = test_router(n) avss_tasks = [None] * n dealer_id = randint(0, n - 1) with ExitStack() as stack: hbavss_list = [None] * n for i in range(n): hbavss = HbAvssBatch( pks, sks[i], crs, n, t, i, sends[i], recvs[i], pc=pc, field=field ) hbavss_list[i] = hbavss stack.enter_context(hbavss) if i == dealer_id: avss_tasks[i] = asyncio.create_task(hbavss.avss(0, values=values)) else: avss_tasks[i] = asyncio.create_task(hbavss.avss(0, dealer_id=dealer_id)) await asyncio.gather(*[hbavss_list[i].output_queue.get() for i in range(n)]) for task in avss_tasks: task.cancel()
async def hbavss_multibatch_dealer(test_router, params): (t, n, g, h, pks, sks, crs, pc, values, field) = params sends, recvs, _ = test_router(n + 1) dealer_id = n hbavss = HbAvssBatch( pks, None, crs, n, t, dealer_id, sends[dealer_id], recvs[dealer_id], pc=pc, field=field, ) # (# noqa: E501) await hbavss.avss(0, values=values, client_mode=True)
async def test_hbavss_batch_client_mode(test_router): t = 2 n = 3 * t + 1 g, h, pks, sks = get_avss_params(n + 1, t) sends, recvs, _ = test_router(n + 1) crs = gen_pc_const_crs(t, g=g, h=h) values = [ZR.random()] * (t + 1) avss_tasks = [None] * (n + 1) hbavss_list = [None] * n dealer_id = n with ExitStack() as stack: client_hbavss = HbAvssBatch(pks, None, crs, n, t, dealer_id, sends[dealer_id], recvs[dealer_id]) stack.enter_context(client_hbavss) avss_tasks[n] = asyncio.create_task( client_hbavss.avss(0, values=values, client_mode=True)) for i in range(n): hbavss = HbAvssBatch(pks, sks[i], crs, n, t, i, sends[i], recvs[i]) hbavss_list[i] = hbavss stack.enter_context(hbavss) avss_tasks[i] = asyncio.create_task( hbavss.avss(0, dealer_id=dealer_id, client_mode=True)) avss_tasks[i].add_done_callback(print_exception_callback) outputs = await asyncio.gather( *[hbavss_list[i].output_queue.get() for i in range(n)]) shares = [output[2] for output in outputs] for task in avss_tasks: task.cancel() fliped_shares = list(map(list, zip(*shares))) recovered_values = [] for item in fliped_shares: recovered_values.append( polynomials_over(ZR).interpolate_at(zip(range(1, n + 1), item))) assert recovered_values == values
async def test_hbavss_batch_encryption_fault(test_router): class BadDealer(HbAvssBatch): def _get_dealer_msg(self, values, n): fault_n = randint(1, n - 1) secret_size = len(values) phi = [None] * secret_size commitments = [None] * secret_size aux_poly = [None] * secret_size for k in range(secret_size): phi[k] = self.poly.random(self.t, values[k]) commitments[k], aux_poly[k] = self.poly_commit.commit(phi[k]) ephemeral_secret_key = self.field.random() ephemeral_public_key = pow(self.g, ephemeral_secret_key) dispersal_msg_list = [None] * n for i in range(n): shared_key = pow(self.public_keys[i], ephemeral_secret_key) z = [None] * secret_size for k in range(secret_size): witness = self.poly_commit.create_witness( phi[k], aux_poly[k], i + 1) if i == fault_n: z[k] = (ZR.random(), ZR.random(), witness) else: z[k] = (phi[k](i + 1), aux_poly[k](i + 1), witness) zz = SymmetricCrypto.encrypt(str(shared_key).encode(), z) dispersal_msg_list[i] = zz return dumps( (commitments, ephemeral_public_key)), dispersal_msg_list t = 2 n = 3 * t + 1 g, h, pks, sks = get_avss_params(n, t) sends, recvs, _ = test_router(n) crs = gen_pc_const_crs(t, g=g, h=h) values = [ZR.random()] * (t + 1) avss_tasks = [None] * n dealer_id = randint(0, n - 1) with ExitStack() as stack: hbavss_list = [] for i in range(n): if i == dealer_id: hbavss = BadDealer(pks, sks[i], crs, n, t, i, sends[i], recvs[i]) else: hbavss = HbAvssBatch(pks, sks[i], crs, n, t, i, sends[i], recvs[i]) hbavss_list.append(hbavss) stack.enter_context(hbavss) if i == dealer_id: avss_tasks[i] = asyncio.create_task( hbavss.avss(0, values=values)) avss_tasks[i].add_done_callback(print_exception_callback) else: avss_tasks[i] = asyncio.create_task( hbavss.avss(0, dealer_id=dealer_id)) avss_tasks[i].add_done_callback(print_exception_callback) outputs = await asyncio.gather( *[hbavss_list[i].output_queue.get() for i in range(n)]) shares = [output[2] for output in outputs] for task in avss_tasks: task.cancel() fliped_shares = list(map(list, zip(*shares))) recovered_values = [] for item in fliped_shares: recovered_values.append( polynomials_over(ZR).interpolate_at(zip(range(1, n + 1), item))) assert recovered_values == values