The libmerkletree library implements Merkle tree calculation, and also
includes some higher-level functions to verify a file against a
previously-generated Merkle tree.
A Merkle tree is a hash tree calculated across blocks in data. Any
block size can be specified in this implementation. A digest is
calculated across each block in the data, and then a digest is
calculated across blocks of the checksums, and this continues until
only one block of digest exists. The hierarchical nature of this
allows individual blocks of a file to be verified, even if other parts
of the file have been modified. A degenerate case, in which the data
is less than the blocksize, will mean that a single digest value for
the block is calculated. This will be the same as the digest
algorithm applied to the whole file.
The digest calculations themselves are done by the libmultigest(3)
library, and allow concatenation of multiple digests to produce a
single large digest value.