アプリケーションとリモートピア間でセキュリティーコンテキストを起動するには、gss_init_sec_context() 関数が使用されます。処理が成功すると、この関数は、確立すべきコンテキストの「コンテキストハンドル」と、受け入れ側に送信すべきコンテキストレベルトークンを返します。gss_init_sec_context() を呼び出す前に、クライアントは次の作業を行う必要があります。
必要であれば、gss_acquire_cred() で資格を獲得します。通常の場合、クライアントはログイン時に資格を受け取ります。gss_acquire_cred() は単純に、実行中のオペレーティングシステムから初期の資格を取得できます。
gss_import_name() で、サーバー名を GSS-API 内部形式にインポートします。名前と gss_import_name() についての詳細は、「GSS-API における名前」を参照してください。
gss_init_sec_context() を呼び出す際、クライアントは通常、次の引数値を渡します。
GSS_C_NO_CREDENTIAL
を引数 cred_handle に渡して、デフォルトの資格を示します
GSS_C_NULL_OID
を引数 mech_type に渡して、デフォルトの機構を示します
GSS_C_NO_CONTEXT
を引数 context_handle に渡して、初期コンテキストが空であることを示します。gss_init_sec_context() は通常ループ内で呼び出されるため、後続の呼び出しは以前の呼び出しで戻されたコンテキストハンドルを渡す必要があります
GSS_C_NO_BUFFER
を引数 input_token に渡して、トークンが最初は空であることを示します。あるいは、アプリケーションは length フィールドが 0 に設定されている gss_buffer_desc オブジェクトへのポインタを渡すこともできます
gss_import_name() で GSS-API 内部形式にインポートされたサーバー名を渡します
アプリケーションは必ずしもこのようなデフォルト値を使用する必要はありません。さらに、クライアントは引数 req_flags を使用して、他のセキュリティーパラメータに対する要件を指定することもできます。gss_init_sec_context() の引数についての詳細は、以降の節で説明します。
コンテキスト受け入れ側は、コンテキスト確立時にいくつかのハンドシェークを要求する可能性があります。つまり、受け入れ側は、コンテキストが完全に確立されるまで、複数のコンテキスト情報を送信するように起動側に要求できます。したがって、移植性のため、コンテキストの起動は常に、コンテキストが完全に確立されたかどうかを検査するループの一部として行われる必要があります。
コンテキストが完全に確立されていない場合、gss_init_sec_context() はメジャー状態コードとして GSS_C_CONTINUE_NEEDED を戻します。したがって、その gss_init_sec_context() からの戻り値を使用して、起動ループを継続するかどうかの判定を行う必要があります。
クライアントはコンテキスト情報をサーバーに、gss_init_sec_context() から戻された「出力トークン」の形式で渡します。クライアントは、サーバーから情報を「入力トークン」として受け取ります。その後、その入力トークンは、後続の gss_init_sec_context() 呼び出しの引数として渡すことができます。受け取った入力トークンの長さが 0 の場合、サーバーはこれ以上出力トークンを要求していないことが分かります。
したがって、ループ内で gss_init_sec_context() の戻り値の状態を検査する以外に、入力トークンの長さも検査する必要があります。その長さが 0 以外の値である場合、別のトークンをサーバーに送信する必要があります。ループを開始する前に、入力トークンの長さを 0 に初期化しておく必要があります。入力トークンを GSS_C_NO_BUFFER
に設定するか、その構造体の length フィールドの値を 0 に設定します。
次の擬似コードは、クライアント側からのコンテキストの確立例を示したものです。
コンテキストを GSS_C_NO_CONTEXT で初期化する 入力トークンを GSS_C_NO_BUFFER で初期化する do call gss_init_sec_context(資格, コンテキスト, 名前, 入力トークン, 出力トークン, その他の引数...) if (受け入れ側に送信すべき出力トークンが存在する) 受け入れ側に出力トークンを送信する 出力トークンを解放する if (コンテキストが完全でない) 受け入れ側から入力トークンを受信する if (GSS-API エラーが発生した) コンテキストを削除する until コンテキストが完成
実際のループは、さまざまなエラー検査を含んだ、より複雑なものになります。そうしたコンテキスト起動ループの実際の例については、「サーバーとのセキュリティーコンテキストの確立」を参照してください。さらに、gss_init_sec_context(3GSS) のマニュアルページにも、上記例ほど一般化されていない例があります。
一般に、コンテキストが完全に確立されていない時に戻されるパラメータ値は、コンテキストが完了した時に戻されるはずの値です。詳細は、gss_init_sec_context() のマニュアルページを参照してください。
gss_init_sec_context() が正常終了すると、GSS_S_COMPLETE が返されます。コンテキスト確立トークンがピアとなるアプリケーションから要求された場合、GSS_S_CONTINUE_NEEDED が返されます。エラーが発生した場合、gss_init_sec_context(3GSS) のマニュアルページに記載されたエラーコードが返されます。
コンテキストの起動が失敗した場合、クライアントはサーバーから切断する必要があります。