DecryptMessage (Schannel) 関数は、メッセージを復号化します。 一部のパッケージでは、メッセージの暗号化と暗号化解除を行うのではなく、整合性 ハッシュを実行して確認します。
この関数を Schannel セキュリティ サポート プロバイダー (SSP) と共に使用して、接続属性の再ネゴシエーション (再実行) または接続のシャットダウンに関するメッセージ送信者からの要求を通知します。
注
1 つのスレッドが暗号化されていて、もう 1 つのスレッドが暗号化解除している場合は、1 つのセキュリティ サポート プロバイダー インターフェイス (SSPI) コンテキストで 2 つの異なるスレッドから EncryptMessage (Schannel) と DecryptMessage (Schannel) を同時に呼び出すことができます。 複数のスレッドが暗号化されている場合、または複数のスレッドが復号化している場合、各スレッドは一意のコンテキストを取得する必要があります。
構文
SECURITY_STATUS SEC_Entry DecryptMessage(
_In_ PCtxtHandle phContext,
_Inout_ PSecBufferDesc pMessage,
_In_ ULONG MessageSeqNo,
_Out_ PULONG pfQOP
);
パラメーター
phContext [in]
メッセージの復号化に使用する セキュリティ コンテキスト へのハンドル。
pMessage [in, out]
SecBufferDesc 構造体へのポインター。 入力時に、構造体は 1 つ以上 の SecBuffer 構造体を参照します。 これらのバッファーの 1 つにSECBUFFER_DATA型を指定できます。 そのバッファーには、暗号化されたメッセージが含まれています。 この関数は、暗号化されたメッセージを暗号化解除し、バッファーの元の内容を上書きします。
接続指向ではないコンテキストで Schannel SSP を使用する場合、構造体には入力に 4 つの SecBuffer 構造体が含まれている必要があります。 1 つのバッファーはSECBUFFER_DATA型で、暗号化されたメッセージが含まれている必要があります。このバッファーには、関数が暗号化を解除します。 残りのバッファーは出力に使用され、SECBUFFER_EMPTY型である必要があります。 接続指向コンテキストの場合は、非接続指向コンテキストで説明されているように、SECBUFFER_DATA型バッファーを指定する必要があります。 さらに、セキュリティ トークンを含む 2 つ目のSECBUFFER_TOKEN型バッファーを指定する必要があります。
MessageSeqNo [in]
トランスポート アプリケーションで予期されるシーケンス番号 (存在する場合)。 トランスポート アプリケーションでシーケンス番号が保持されない場合は、このパラメーターを 0 に設定します。
Schannel SSP を使用する場合は、このパラメーターを 0 に設定します。 Schannel SSP はシーケンス番号を使用しません。
pfQOP [out]
保護の品質を示すパッケージ固有のフラグを受け取る ULONG 型の変数へのポインター。
Schannel SSP を使用する場合は、このパラメーターを使用しないでください。 これを NULL に設定します。
このパラメーターには、次のフラグを指定できます。
| 価値 | 意味 |
|---|---|
| SECQOP_WRAP_NO_ENCRYPT | メッセージは暗号化されませんでしたが、関数によってヘッダーまたはトレーラーが生成されました。 手記: KERB_WRAP_NO_ENCRYPTには同じ値と同じ意味があります。 |
戻り値
関数は、メッセージが正しいシーケンスで受信されたことを確認すると、SEC_E_OKを返します。
関数がメッセージの暗号化解除に失敗した場合は、次のいずれかのエラー コードが返されます。
| リターン コード | 説明 |
|---|---|
| SEC_E_INVALID_HANDLE | phContext パラメーターは、無効なコンテキスト ハンドルを指定します。 Schannel SSP と共に使用されます。 |
| SEC_E_INVALID_TOKEN | バッファーの型が正しくないか、SECBUFFER_DATA型のバッファーが見つかりません。 Schannel SSP と共に使用されます。 |
| SEC_E_MESSAGE_ALTERED | メッセージが変更されます。 Schannel SSP と共に使用されます。 |
| SEC_E_OUT_OF_SEQUENCE | メッセージが正しい順序で受信されません。 |
| SEC_I_CONTEXT_EXPIRED | メッセージ送信者は接続の使用を終了し、シャットダウンを開始します。 シャットダウンの開始または認識については、「Schannel 接続のシャットダウン」を参照してください。 Schannel SSP と共に使用されます。 |
| SEC_I_RENEGOTIATE | リモート パーティが新しいハンドシェイク シーケンスを必要とするか、アプリケーションがシャットダウンを開始します。 ネゴシエーション ループに戻り 、AcceptSecurityContext (Schannel) または InitializeSecurityContext (Schannel) を呼び出し、DecryptMessage によって変更されたバッファーと同じバッファーを渡し、SecBuffer 型が SECBUFFER_TOKEN に設定されていることを確認します。 |
注釈
アプリケーションがリモート パーティからデータを読み取り、 DecryptMessage (Schannel) を使用して復号化を試み、 DecryptMessage (Schannel) が成功しても出力バッファーが空であることを検出することがあります。 この動作は正常であり、アプリケーションで処理できる必要があります。
Schannel SSP を使用すると、メッセージ送信者が接続をシャットダウンしたときに DecryptMessage (General) 関数はSEC_I_CONTEXT_EXPIREDを返します。 シャットダウンの開始または認識については、「Schannel 接続のシャットダウン」を参照してください。
TLS 1.0 を使用している場合は、メッセージ全体を復号化するために、この関数を複数回呼び出し、各呼び出しの入力バッファーを調整することが必要になる場合があります。
DecryptMessage (Schannel) 関数は、アプリケーション データ以外のハンドシェイク後の TLS プロトコル メッセージを受信すると、SEC_I_RENEGOTIATEを返します。
DecryptMessage (Schannel) がSEC_I_RENEGOTIATEを返すと、それ以上の EncryptMessage() 呼び出しと DecryptMessage() 呼び出しは、SEC_E_CONTEXT_EXPIREDで失敗します。 アプリケーションは 、AcceptSecurityContext (Schannel) ( サーバー側) または InitializeSecurityContext (Schannel) ( クライアント側) を呼び出し、 DecryptMessage によって変更されたのと同じバッファーを渡して、 SecBuffer 型が SECBUFFER_TOKENに設定されていることを確認することで、この状況を処理します。
DecryptMessage は、SEC_I_RENEGOTIATEが返されるときに常にSECBUFFER_EXTRA バッファーを返すわけではありません。 この最初の呼び出しで値が返されたら、アプリケーションが新しい接続を作成しているかのように続行します。 その後、アプリケーションは EncryptMessage() と DecryptMessage() の呼び出しを続行できます。 詳細については、「 Schannel セキュリティ コンテキストの作成」を参照してください。
必要条件
| 要件 | 価値 |
|---|---|
| サポートされる最小クライアント | Windows XP [デスクトップ アプリのみ] |
| サポートされている最小サーバー | Windows Server 2003 [デスクトップ アプリのみ] |
| ヘッダ | Sspi.h (Security.h を含む) |
| 図書館 | Secur32.lib |
| DLL | Secur32.dll |