메시지 확인
다음 예제에서는 서명된 메시지를 받고 확인하는 코드를 보여줍니다. 이 예제에서는 SignatureBuffer 및 SignatureBufferSize에서 서명 버퍼와 해당 크기 및 메시지 버퍼와 MessageBuffer 및 MessageBufferSize의 크기를 받습니다.
이 예제에서는 phContext라는 SecHandle 변수와 s라는 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");
}
}