예제 #1
0
 def get_degree_and_secret(shares):
     decoder = DecoderFactory.get(eval_point)
     polys = decoder.decode(list(range(n)),
                            transpose_lists(list(shares)))
     secrets = [p[0] for p in polys]
     degrees = [get_degree(p) for p in polys]
     return degrees, secrets
예제 #2
0
async def test_randousha(test_router, polynomial, galois_field, n, k):
    t = (n - 1) // 3
    sends, receives, _ = test_router(n)
    shares_per_party = await asyncio.gather(*[
        randousha(n, t, k, i, sends[i], receives[i], galois_field)
        for i in range(n)
    ])
    assert len(shares_per_party) == n
    assert all(
        len(random_shares) == (n - 2 * t) * k
        for random_shares in shares_per_party)
    random_values = []
    eval_point = EvalPoint(galois_field, n, use_omega_powers=False)
    decoder = DecoderFactory.get(eval_point, Algorithm.VANDERMONDE)
    for i, shares in enumerate(zip(*shares_per_party)):
        shares_t, shares_2t = zip(*shares)
        poly_t = polynomial(decoder.decode(list(range(n)), shares_t))
        poly_2t = polynomial(decoder.decode(list(range(n)), shares_2t))
        r_t = poly_t(0)
        r_2t = poly_2t(0)
        assert len(poly_t.coeffs) == t + 1
        assert len(poly_2t.coeffs) == 2 * t + 1
        assert r_t == r_2t
        random_values.append(r_t)
    assert len(set(random_values)) == (n - 2 * t) * k
예제 #3
0
async def robust_reconstruct(field_futures, field, n, t, point, degree):
    use_omega_powers = point.use_omega_powers
    enc = EncoderFactory.get(
        point, Algorithm.FFT if use_omega_powers else Algorithm.VANDERMONDE)
    dec = DecoderFactory.get(
        point, Algorithm.FFT if use_omega_powers else Algorithm.VANDERMONDE)
    robust_dec = RobustDecoderFactory.get(t, point, algorithm=Algorithm.GAO)
    incremental_decoder = IncrementalDecoder(enc, dec, robust_dec, degree, 1,
                                             t)

    async for (idx, d) in fetch_one(field_futures):
        incremental_decoder.add(idx, [d.value])
        if incremental_decoder.done():
            polys, errors = incremental_decoder.get_results()
            return polynomials_over(field)(polys[0]), errors
    return None, None
def test_auto_decode_fft_enabled(fft_decoding_test_cases):
    for test_case in fft_decoding_test_cases:
        z, encoded, decoded, point = test_case
        dec = DecoderFactory.get(point)
        actual = dec.decode(z, encoded)
        assert actual == decoded