DES Authentication Protocol
This section explains the DES authentication protocol.
enum authdes_namekind {
ADN_FULLNAME = 0,
ADN_NICKNAME = 1
};
typedef opaque des_block[8];
const MAXNETNAMELEN = 255;
A credential is either a client's full network name or its nickname. For the first transaction with the server, the client must use its full name. For subsequent transactions, the client can use its nickname. DES authentication protocol includes a 64-bit block of encrypted DES data and specifies the maximum length of a network user's name.
union authdes_cred switch (authdes_namekind adc_namekind) {
case ADN_FULLNAME:
authdes_fullname adc_fullname;
case ADN_NICKNAME:
unsigned int adc_nickname;
};
The full name contains the network name of the client, an encrypted conversation key, and the window. The window is actually a lifetime for the credential. The server can terminate a client's time stamp and not grant the request if the time indicated by the verifier time stamp plus the window has expired. In the first transaction, the server confirms that the window verifier is one second less than the window. To ensure that requests are granted only once, the server can require time stamps in subsequent requests to be greater than the client's previous time stamps.
struct authdes_fullname {
string name<MAXNETNAMELEN>; /* name of client */
des_block key; /*PK encrypted conversation key*/
unsigned int window; /* encrypted window */
};
struct timestamp {
unsigned int seconds; /* seconds */
unsigned int useconds; /* and microseconds */
struct {
adv_timestamp; /* one DES block */
adc_fullname.window; /* one half DES block */
adv_winverf; /* one half DES block */
}
The window verifier is only used in the first transaction. In conjunction with the fullname credential, these items are packed into the structure shown previously before being encrypted.
struct authdes_verf_clnt {
timestamp adv_timestamp; /* encrypted timestamp */
unsigned int adv_winverf; /* encrypted window verifier */
};
struct authdes_verf_svr {
timestamp adv_timeverf; /* encrypted verifier */
unsigned int adv_nickname; /* new nickname for client */
};