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