def collude_and_recover(num_players, reconstruction_threshold, max_secret_length, shares_subset, num_collude): ''' Args: num_players, the number of players that were shared across reconstruction_threshold, the threshold for reconstruction max_secret_length, the maximum length of the secret that was shared shares_subset, a dictionary of a subset of players to json robust shares num_corrupt, the number of players that will collude Returns: the result of robust reconstruction ''' max_secret_length = len(secret) colluders = {player: rss._deserialize_robust_share(share) for player, share in shares_subset.items()[:num_collude]} for player, player_dict in colluders.items(): player_dict["share"] /= 2 for verifier, verifier_dict in colluders.items(): new_key, new_vector = authentication.generate_check_vector(player_dict["share"], max_secret_length) verifier_dict["keys"][player] = new_key player_dict["vectors"][verifier] = new_vector # assert that these players do in fact collude for verifier, verifier_dict in colluders.items(): for player, player_dict in colluders.items(): assert authentication.validate(verifier_dict["keys"][player], player_dict["vectors"][verifier], player_dict["share"], max_secret_length) is True shares = combine_testing_dictionaries(shares_subset, jsonify_dict(colluders)) return rss.reconstruct_authenticated_secret(num_players, reconstruction_threshold, max_secret_length, shares)
def test_check_vector_message_too_large(): message = ('123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '12345678901234567890') max_length = len(message) message = int(message) with pytest.raises(ValueError): authentication.generate_check_vector(message, max_length)
def test_check_vector_b(): message = 112358132134 max_length = len(str(message)) for i in range(1000): key, vector = authentication.generate_check_vector(message, max_length) if (vector[0] == 0): # verify that b is never zero for many cases assert False else: assert authentication.validate(key, vector, message, max_length) and vector[0] != 0
def test_check_vector_large(): message = ('123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '123456789012345678901234567890123456789012345678901234567890' '12345678901234567890') max_length = len(message) message = int(message) key, vector = authentication.generate_check_vector(message, max_length) assert authentication.validate(key, vector, message, max_length) is True
def test_check_vector_standard(): message = 112358132134 max_length = len(str(message)) key, vector = authentication.generate_check_vector(message, max_length) assert authentication.validate(key, vector, message, max_length) is True