Kerberos v5 has the ability to use multiple checksum algorithms.  Any
checksum implementation which desires to link with and be usable from the MIT
Kerberos v5 implementation must implement this interface:

\subsection{Functional interface}

\begin{funcdecl}{sum_func}{krb5_error_code}{\funcin}
\funcarg{krb5_pointer}{in}
\funcarg{size_t}{in_length}
\funcarg{krb5_pointer}{seed}
\funcarg{size_t}{seed_length}
\funcout
\funcarg{krb5_checksum *}{outcksum}
\end{funcdecl}

This routine computes the desired checksum over \funcparam{in_length} bytes
at \funcparam{in}. \funcparam{seed_length} bytes of a seed (usually an
encryption key) are pointed to by \funcparam{seed}.  Some checksum
algorithms may choose to ignore \funcparam{seed}.  If
\funcparam{seed_length} is zero, then there is no seed available.
The routine places the resulting value into \funcparam{outcksum{\ptsto}contents}.

\funcparam{outcksum{\ptsto}contents} must be set by the caller to point
to enough storage to contain the checksum; the size necessary is an
element of the \datatype{krb5_checksum_entry} structure.

\subsection{Other data elements}
In addition to the above listed function entry point, each checksum algorithm
should have an entry in \globalname{krb5_cksumarray} and a
\datatype{krb5_checksum_entry} structure describing the entry points
and checksum size for the algorithm.
