def test_split_as_chunks_and_recombine():

    bytestring = get_random_bytes(100)

    chunks = split_as_chunks(bytestring, chunk_size=25, must_pad=True)
    assert all(len(x) == 25 for x in chunks)
    result = recombine_chunks(chunks, chunk_size=25, must_unpad=True)
    assert result == bytestring

    chunks = split_as_chunks(bytestring, chunk_size=22, must_pad=True)
    assert all(len(x) == 22 for x in chunks)
    result = recombine_chunks(chunks, chunk_size=22, must_unpad=True)
    assert result == bytestring

    chunks = split_as_chunks(bytestring, chunk_size=25, must_pad=False)
    assert all(len(x) == 25 for x in chunks)
    result = recombine_chunks(chunks, chunk_size=25, must_unpad=False)
    assert result == bytestring

    with pytest.raises(ValueError, match="size multiple of chunk_size"):
        split_as_chunks(bytestring, chunk_size=22, must_pad=False)

    chunks = split_as_chunks(
        bytestring, chunk_size=22, must_pad=False, accept_incomplete_chunk=True
    )
    assert not all(len(x) == 22 for x in chunks)
    result = recombine_chunks(chunks, chunk_size=22, must_unpad=False)
    assert result == bytestring
def recombine_secret_from_samir_shares(shares: list) -> bytes:
    """Permits to reconstruct a key which has its secret shared
    into `shares_count` shares thanks to a list of `shares`

    :param shares: list of k full-length shares (k being exactly the threshold of this shared secret)

    :return: the key reconstructed as bytes"""

    shares_per_secret = []  # List of lists of same-index 16-bytes shares

    assert len(set(share[0] for share in shares)) == len(
        shares)  # All shares have unique idx

    for share in shares:
        idx, secret = share
        chunks = split_as_chunks(secret, chunk_size=16, must_pad=False)
        shares_per_secret.append([(idx, chunk) for chunk in chunks])

    assert (len(set(len(chunks) for chunks in shares_per_secret)) == 1
            )  # Same-length lists

    all_chunk_shares = list(zip(*shares_per_secret))

    chunks = []
    for chunk_shares in all_chunk_shares:
        chunk = _recombine_128b_shares_into_bytestring(chunk_shares)
        chunks.append(chunk)

    secret = recombine_chunks(chunks,
                              chunk_size=SHAMIR_CHUNK_LENGTH,
                              must_unpad=True)

    return secret