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