\section{Generic Digest Interface}

All hash algorithms in \texttt{libft\_ssl} are exposed through a single,
uniform interface built around the \texttt{struct digest\_algo} type. This
structure holds the algorithm's metadata (its name, digest size and block size)
along with three function pointers: \texttt{init}, \texttt{update} and
\texttt{final}. This design allows any algorithm to be driven through the same
calling convention without the caller needing to know which one is in use. The
associated context is held in a \texttt{union digest\_ctx}, which overlays the
per-algorithm state structures so that a single allocation covers all supported
algorithms.

\vspace{1em}

\texttt{struct digest\_algo} describes a hash algorithm as a set of metadata
and three function pointers. The \texttt{name} field identifies the algorithm.
The \texttt{digest\_size} and \texttt{block\_size} fields express its output
length and internal block size in bytes. The three function pointers
\texttt{init}, \texttt{update} and \texttt{final} define the algorithm's
lifecycle: \texttt{init} sets the context to its initial state, \texttt{update}
feeds an arbitrary amount of data into it, and \texttt{final} produces the
digest and resets the context. All three operate on a \texttt{void~*} context
pointer, which allows the interface to remain algorithm-agnostic.

\vspace{1em}

The \texttt{union digest\_ctx} type provides a single allocation large enough
to hold the context of any supported algorithm. Because only one algorithm is
active at a time, overlaying the per-algorithm structures in a union avoids the
overhead of a separate heap allocation while keeping the calling code uniform.
The active member is always the one matching the \texttt{struct digest\_algo}
being used.

\vspace{1em}

Each supported algorithm is registered in \texttt{digest\_algos.h} through an
X-macro list. This file defines a single macro \texttt{DIGEST\_ALGOS(X)} that
expands \texttt{X} once per algorithm, passing its name, digest size and block
size. Consuming this list with a different definition of \texttt{X} generates
the corresponding code or data without repetition --- the global \texttt{struct
digest\_algo} instances in \texttt{libft\_ssl.c} are produced this way. Adding
a new algorithm to the library reduces to adding one line to this list.

\vspace{1em}

All three algorithms follow the Merkle-Damgård construction. The message is
split into fixed-size blocks and processed sequentially. After each block, the
compressed output is combined with the previous state to produce the new state
--- this chaining ensures that the final digest depends on every bit of the
input. The exact combination operation is algorithm-specific: MD5 and SHA-256
use an additive feedforward, while Whirlpool uses the Miyaguchi-Preneel scheme.

\newpage
