Schannel によって返される追加のバッファー
セキュリティ コンテキストが確立されている間、および Schannel によって提供される暗号化および復号化機能を使用してセキュリティで保護されたメッセージが交換されるため、クライアントとサーバーの間で情報を送信する必要があります。 これらのタスクを実行するには、次の関数を使用します。
Schannel には、これらの関数への入力バッファーに含まれる不完全または過剰な情報に対する適切に定義された一連の動作があります。 情報は、次の方法でクライアントとサーバーの間で交換されます。
- ローカル パーティは、SSPI 関数を呼び出して情報を渡すことによって、Schannel と対話します。 通常、情報はリモート パーティから受信されました。
- 関数は、状態コードと、情報を含む出力バッファーを返します。
- 状態コードに応じて、出力バッファーは、何らかの通信メカニズムを使用してリモート パーティに送信されます。
- リモート パーティは、ローカル パーティによって送信された情報を読み取ります。
- ループが繰り返され、ローカルパーティとリモートパーティが交換されます。 (リモート パーティは SSPI 関数を呼び出し、前の手順で読み取った情報を渡します)。
SSPI 関数への入力バッファーに必要な情報が正確に含まれている場合、すべてが期待どおりに動作します。 ただし、一部の通信プロトコルのストリーム指向の性質により、これは当たらない可能性があります。リモート パーティから受信した情報ブロックに含まれるデータの量が、必要なデータよりも少ない場合や、Schannel が 1 回の関数呼び出しで処理できるデータよりも多い場合があります。
入力バッファーに含まれる情報が少なすぎる場合、関数はSEC_E_INCOMPLETE_MESSAGEを返します。 呼び出し元は、リモート パーティから追加のデータを取得し、関数を再度呼び出す必要があります。
入力バッファーに多くの情報が含まれている場合、Schannel はこれをエラーとして扱いません。 関数は可能な限り多くの入力を処理し、その処理アクティビティの状態コードを返します。 さらに、Schannel は、SECBUFFER_EXTRA型の出力バッファーを返すことによって、入力バッファーに未処理の情報が存在することを示します。 この種類のバッファーの出力バッファーをテストすることが、この状況を検出する唯一の方法です。 余分なバッファー構造の cbBuffer フィールドは、処理されなかった入力のバイト数を示します。
Note
余分なバッファーの pvBuffer フィールドには、余分なデータのコピーが含まれていません。
SSPI 関数から追加のバッファーを受け取った場合は、入力バッファーから既に処理されている情報を削除し、関数をもう一度呼び出す必要があります。 Schannel は、多くの場合、追加のバッファーのみを返し、出力バッファー内の他の何も返すことができません。