async def test_cant_multiply_shares_from_different_contexts(): from honeybadgermpc.mpc import TaskProgramRunner import asyncio n, t, k = 9, 2, 2000 pp_elements = PreProcessedElements() pp_elements.generate_double_shares(k, n, t) pp_elements.generate_rands(k, n, t) async def _prog(context): share = context.Share(1) return share test_runner_1 = TaskProgramRunner(n, t) test_runner_2 = TaskProgramRunner(n, t) test_runner_1.add(_prog) test_runner_2.add(_prog) s1, s2 = await asyncio.gather(test_runner_1.join(), test_runner_2.join()) async def _prog2(context): with raises(TypeError): await s1[0] * s2[0] test_runner_3 = TaskProgramRunner( n, t, {DoubleSharingMultiply.name, DoubleSharingMultiply()}) test_runner_3.add(_prog2) await test_runner_3.join()
async def test_get_double_share(): n, t = 9, 2 pp_elements = PreProcessedElements() pp_elements.generate_double_shares(1000, n, t) async def _prog(ctx): r_t_sh, r_2t_sh = ctx.preproc.get_double_shares(ctx) assert r_t_sh.t == ctx.t assert r_2t_sh.t == ctx.t * 2 await r_t_sh.open() await r_2t_sh.open() assert await r_t_sh.open() == await r_2t_sh.open() program_runner = TaskProgramRunner(n, t) program_runner.add(_prog) await program_runner.join()
async def test_degree_reduction_share_array(test_runner): n, t = 7, 2 pp_elements = PreProcessedElements() pp_elements.generate_rands(1000, n, 2 * t) pp_elements.generate_double_shares(1000, n, t) async def _prog(context): shares = [context.preproc.get_rand(context, 2 * t) for _ in range(10)] sh_x_2t = context.ShareArray(shares, 2 * t) x_actual = await ( await DoubleSharingMultiplyArrays.reduce_degree_share_array( context, sh_x_2t)).open() x_expected = await sh_x_2t.open() for a, b in zip(x_actual, x_expected): assert a == b await run_test_program(_prog, test_runner, n, t)
def _preprocess(n, t, k, to_generate): from honeybadgermpc.preprocessing import PreProcessedElements pp_elements = PreProcessedElements() for kind in to_generate: if kind == "triples": pp_elements.generate_triples(k, n, t) elif kind == "cubes": pp_elements.generate_cubes(k, n, t) elif kind == "zeros": pp_elements.generate_zeros(k, n, t) elif kind == "rands": pp_elements.generate_rands(k, n, t) elif kind == "bits": pp_elements.generate_bits(k, n, t) elif kind == "one_minus_one": pp_elements.generate_one_minus_ones(k, n, t) elif kind == "double_shares": pp_elements.generate_double_shares(k, n, t) elif kind == "share_bits": pp_elements.generate_share_bits(k, n, t) else: raise ValueError(f"{kind} must be manually preprocessed")