Kerberos v5 has the ability to use multiple encryption systems.  Any
encryption system which desires to link with and be usable from the MIT
Kerberos v5 implementation must implement at least this interface:

\subsection{Functional interface}

\begin{funcdecl}{encrypt_func}{krb5_error_code}{\funcvoid}
\funcarg{krb5_const_pointer}{in}
\funcarg{krb5_pointer}{out}
\funcarg{const size_t}{size}
\funcarg{krb5_encrypt_block *}{eblock}
\funcarg{krb5_pointer}{ivec}
\end{funcdecl}
Encrypts \funcparam{size} bytes at \funcparam{in}, storing result in
\funcparam{out}.  \funcparam{eblock} points to an encrypt block which
has been initialized by \funcname{process_key}.

\funcparam{in} must include sufficient space beyond the \funcparam{size}
bytes of input data to hold pad and redundancy check bytes; the macro
\funcname{krb5_encrypt_size} can be used to compute this size.

\funcparam{out} must be preallocated by the caller to contain sufficient
storage to hold the output; the macro \funcname{krb5_encrypt_size} can
be used to compute this size.

\funcparam{ivec} points to an initial vector/seed to be used in the encryption.
If null, the cryptosystem may choose an appropriate initialization vector.

%Errors: Returns errors.

\begin{funcdecl}{decrypt_func}{krb5_error_code}{\funcvoid}
\funcarg{krb5_const_pointer}{in}
\funcarg{krb5_pointer}{out}
\funcarg{const size_t}{size}
\funcarg{krb5_encrypt_block *}{eblock}
\funcarg{krb5_pointer}{ivec}
\end{funcdecl}
Decrypts \funcparam{size} bytes at \funcparam{in}, storing result in
\funcparam{out}.
\funcparam{eblock} points to an encrypt block which has been initialized
by \funcname{process_key}.

\funcparam{size} must be a multiple of the encryption block size.

\funcparam{out} must be preallocated by the caller to contain sufficient
storage to hold the output; this is guaranteed to be no more than
the input size.

\funcparam{ivec} points to an initial vector/seed to be used in the decryption.
If null, the cryptosystem may choose an appropriate ivec.

%Errors: Returns errors.

\begin{funcdecl}{process_key}{krb5_error_code}{\funcvoid}
\funcarg{krb5_encrypt_block *}{eblock}
\funcarg{const krb5_keyblock *}{keyblock}
\end{funcdecl}
Does any necessary key preprocessing (such as computing key
schedules for DES).
\funcparam{eblock{\ptsto}crypto_entry} must be set by the caller; the
other elements of \funcparam{eblock} are to be assigned by this function.
[In particular, \funcparam{eblock{\ptsto}key} must be set by this
function if the key is needed in raw form by the encryption routine.]

The caller may not move or reallocate \funcparam{keyblock} before calling
\funcname{finish_key} on \funcparam{eblock}.

%Errors: Returns errors.

\begin{funcdecl}{finish_key}{krb5_error_code}{\funcvoid}
\funcarg{krb5_encrypt_block *}{eblock}
\end{funcdecl}
Does any necessary clean-up on \funcparam{eblock} (such as releasing
resources held by \funcparam{eblock{\ptsto}priv}.

%Errors: Returns errors.

\begin{funcdecl}{string_to_key}{krb5_error_code}{\funcvoid}
\funcarg{const krb5_keytype}{keytype}
\funcarg{krb5_keyblock *}{keyblock}
\funcarg{const krb5_data *}{data}
\funcarg{const krb5_data}{salt}
\end{funcdecl}
Converts the string pointed to by \funcparam{data} into an encryption key
of type \funcparam{keytype}.  \funcparam{*keyblock} is filled in with
the key info; in particular, \funcparam{keyblock{\ptsto}contents} is to
be set to allocated storage. It is the responsibility of the caller to
release this storage when the generated key no longer needed.

The routine may use \funcparam{salt} to seed or alter the conversion
algorithm.

If the particular function called does not know how to make a
key of type \funcparam{keytype}, an error may be returned.

%Errors: Returns errors.

\begin{funcdecl}{init_random_key}{krb5_error_code}{\funcvoid}
\funcarg{const krb5_keyblock *}{seedblock}
\funcarg{krb5_pointer *}{seed}
\end{funcdecl}

Initialize the random key generator using the encryption key
\funcparam{seedblock} and allocating private sequence information, filling
in \funcparam{*seed} with the address of such information.
\funcparam{*seed} is to be passed to \funcname{random_key} to provide
sequence information.

\begin{funcdecl}{finish_random_key}{krb5_error_code}{\funcvoid}
\funcarg{krb5_pointer *}{seed}
\end{funcdecl}

Free any resources held by \funcparam{seed} and assigned by
\funcname{init_random_key}. 

\begin{funcdecl}{random_key}{krb5_error_code}{\funcvoid}
\funcarg{krb5_pointer *}{seed}
\funcarg{krb5_keyblock **}{keyblock}
\end{funcdecl}

Generate a random encryption key, allocating storage for it and
filling in the keyblock address in \funcparam{*keyblock}.
When the caller has finished using the keyblock, he should call
\funcname{krb5_free_keyblock} to release its storage.

\begin{funcdecl}{combine_keys}{krb5_error_code}{\funcin}
\funcarg{const krb5_keyblock *}{key1}
\funcarg{const krb5_keyblock *}{key2}
\funcout
\funcarg{krb5_keyblock **}{outkey}
\end{funcdecl}
Combine the two encryption keys \funcparam{key1} and \funcparam{key2} to
generate a new output key \funcparam{outkey}.  \funcparam{outkey} is
filled in to point to the freshly-allocated key.  When the caller is
finished using the \funcparam{*outkey}, it should be freed with
\funcname{krb5_free_keyblock}.

\subsection{Other data elements}
In addition to the above listed function entry points, each encryption
system should have an entry in \globalname{krb5_csarray} and a
\datatype{krb5_cryptosystem_entry} structure describing the entry points
and key and padding sizes for the encryption system.

\subsection{DES functions}
The DES functions conform to the encryption interface required by the
Kerberos version 5 library, and provide an encryption mechanism based on
the DES Cipher-block chaining mode (CBC), with the addition of a
cyclical redundancy check (CRC-32) for integrity checking upon
decryption.

The functions have the same signatures as those described by the main
library document; the names are:
{\obeylines
\funcname{mit_des_encrypt_func}
\funcname{mit_des_decrypt_func}
\funcname{mit_des_process_key}
\funcname{mit_des_finish_key}
\funcname{mit_des_string_to_key}
\funcname{mit_des_init_random_key}
\funcname{mit_des_finish_random_key}
\funcname{mit_des_random_key}
}
The \datatype{krb5_cryptosystem_entry} for this cryptosystem is
\globalname{mit_des_cryptosystem_entry}.
