メッセージの検証
次の例は、署名付きメッセージを受信して確認するコードを示しています。 この例では、SignatureBuffer と SignatureBufferSize の署名バッファーとそのサイズ、および MessageBuffer と MessageBufferSize のメッセージ バッファーとそのサイズを受け取ります。
この例では、phContext という名前の SecHandle 変数と、 という名前の SOCKET 構造体が初期化されていることを前提としています。 これらの変数の宣言と開始については、「 Windows ソケット クライアントでの SSPI の使用」および「Windows ソケットサーバーでの SSPI の使用」を参照してください。 このコードには、Secur32.lib の関数の呼び出しが含まれています。これはリンク ライブラリに含める必要があります。
//--------------------------------------------------------------------
// Declare and initialize local variables.
#include <windows.h>
#include <stdio.h>
#include <sspi.h>
#define SECURITY_WIN32
#define MaxMessageLength 1024
#define BUFSIZ 512
void main()
{
BYTE MessageBuffer[BUFSIZ];
BYTE SignatureBuffer[BUFSIZ];
DWORD MessageBufferSize;
DWORD SignatureBufferSize;
SECURITY_STATUS SecStatus;
SecBufferDesc InputBufferDescriptor;
SecBuffer InputSecurityToken[2];
ULONG fQOP;
//------------------------------------------------------------------
// Receive the message.
if(!(ReceiveMsg(
s,
MessageBuffer,
MaxMessageLength,
&MessageBufferSize)))
{
MyHandleError("Error. Message not received.");
}
//------------------------------------------------------------------
// Receive the signature.
if(!(ReceiveMsg(
s,
SignatureBuffer,
MaxMessageLength,
&SignatureBufferSize)))
{
MyHandleError("Error. Signature not received.");
}
//------------------------------------------------------------------
// Build the input buffer descriptor.
InputBufferDescriptor.cBuffers = 2;
InputBufferDescriptor.pBuffers = InputSecurityToken;
InputBufferDescriptor.ulVersion = SECBUFFER_VERSION;
//-------------------------------------------------------------------
// Build the security buffer for the message.
InputSecurityToken[0].BufferType = SECBUFFER_DATA;
InputSecurityToken[0].cbBuffer = MessageBufferSize;
InputSecurityToken[0].pvBuffer = MessageBuffer;
//-------------------------------------------------------------------
// Build the security buffer for the signature.
InputSecurityToken[1].BufferType = SECBUFFER_TOKEN;
InputSecurityToken[1].cbBuffer = SignatureBufferSize;
InputSecurityToken[1].pvBuffer = SignatureBuffer;
//--------------------------------------------------------------------
// Call VerifySignature.
SecStatus = VerifySignature(
&phContext,
&InputBufferDescriptor, // input message descriptor
0, // no sequence number
&fQOP // quality of protection
);
if(SecStatus == SEC_E_OK)
{
printf("The signature verified the message.\n");
}
else
if(SecStatus == SEC_E_MESSAGE_ALTERED)
{
printf("The message was altered in transit.\n");
}
else
if(SecStatus == SEC_E_OUT_OF_SEQUENCE )
{
printf("The message is out of sequence.\n");
}
else
{
printf("An unknown error occurred in VerifyMessage.\n");
}
}