次の AUTH_KERB の例は AUTH_DES と多くの点で似ていることが次のコーディング例からわかります。両者の違いに注意してください。
#define AUTH_KERB 4 /* * 資格は 2 種類ある。1 つはクライアントが * Kerberos チケット (以前に暗号化された) を送信する際の資格で、 * もう 1 つはサーバーがクライアントに与えた * ニックネーム (単純な符号なし整数)。 * クライアントはサーバーとの最初のトランザクションではそのフルネームを * 使用する必要がある。その際、サーバーはクライアントへニックネームを返す。 * クライアントはそれ以降のサーバーとのすべてのトランザクションで * このニックネームを使用できる (チケットが期限切れとなるまで)。 * ニックネームは使用しなくてもかまいませんが、パフォーマンス上の理由から * 使用するほうが望ましい。 */ enum authkerb_namekind { AKN_FULLNAME = 0, AKN_NICKNAME = 1 }; /* * フルネームには暗号化されたサービスチケットと * ウィンドウが含まれる。ウィンドウは資格の有効期限。 * ベリファイアのタイムスタンプに記載された時刻に * ウィンドウの時間を加えた時刻が過ぎると、サーバーは要求を期限切れとし、 * 許可しない。要求を再送信しないように、最初のトランザクションを除き、 * サーバーは前回よりも大きな値のタイムスタンプを要求する。 * 最初のトランザクションでは、サーバーはタイムスタンプを * チェックする代わりに、ウィンドウベリファイアがウィンドウより 1 だけ * 少ないかどうかを調べる。 */ struct authkerb_fullname { KTEXT_ST ticket; /* Kerberos サービスチケット */ unsigned long window; /* 暗号化されたウィンドウ */ }; /* * 資格はフルネームまたはニックネームのどちらか。 */ union authkerb_credswitch(authkerb_namekind akc_namekind){ case AKN_FULLNAME: authkerb_fullname akc_fullname; case AKN_NICKNAME: unsigned long akc_nickname; }; /* * タイムスタンプは 1970 年 1 月 1 日午前 0 時からの秒数を符号化したもの。 */ struct timestamp { unsigned long seconds; /* 秒 */ unsigned long useconds; /* マイクロ秒 */ }; /* * ベリファイア: クライアント側 */ struct authkerb_verf_clnt { timestamp akv_timestamp; /* 暗号化されたタイムスタンプ */ unsigned long akv_winverf; /* 暗号化されたウィンドウベリファイア */ }; /* * ベリファイア: サーバー側 * サーバーは、クライアントがサーバーに渡したタイムスタンプと同じ * タイムスタンプ (暗号化された) を返す。 サーバーはまた、 * クライアントへ今後のトランザクションで使用する * ニックネーム (暗号化されていない) を通知する。 */ struct authkerb_verf_svr { timestamp akv_timeverf; /* 暗号化されたベリファイア */ unsigned long akv_nickname; /* クライアントの新しいニックネーム */ };