簽署訊息
當用戶端和伺服器完成 安全性內容的設定時,可以使用訊息支援函式。 用戶端和伺服器會使用建立會話時建立的安全性內容權杖,以呼叫 MakeSignature 和 VerifySignature 函 式。 內容權杖可以與 EncryptMessage (General) 和 DecryptMessage (General) 搭配使用,以取得通訊 隱私權。
下列範例顯示用戶端產生要傳送至伺服器的已簽署訊息。 呼叫MakeSignature之前,用戶端會使用SecPkgCoNtext_Sizes結構來呼叫 QueryCoNtextAttributes (General) ,以判斷保存訊息簽章所需的緩衝區長度。 如果 cbMaxSignature 成員為零, 安全性套件 不支援簽署訊息。 否則,這個成員會指出要配置給接收簽章的緩衝區大小。
此範例假設已初始化名為phCoNtext的SecHandle變數和名為s 的SOCKET結構。 如需這些變數的宣告和初始化,請參閱 搭配 Windows Sockets Client 使用 SSPI 和 搭配 Windows Sockets Server 使用 SSPI。 此範例包含 Secur32.lib 中函式的呼叫,這些函式必須包含在程式庫之間。
//--------------------------------------------------------------------
// Declare and initialize local variables.
SecPkgContext_Sizes ContextSizes;
char *MessageBuffer = "This is a sample buffer to be signed.";
DWORD MessageBufferSize = strlen(MessageBuffer);
SecBufferDesc InputBufferDescriptor;
SecBuffer InputSecurityToken[2];
ss = QueryContextAttributes(
&phContext,
SECPKG_ATTR_SIZES,
&ContextSizes
);
if(ContextSizes.cbMaxSignature == 0)
{
MyHandleError("This session does not support message signing.");
}
//--------------------------------------------------------------------
// The message as a byte string is in the variable
// MessageBuffer, and its length is in MessageBufferSize.
//--------------------------------------------------------------------
// Build the buffer descriptor and the buffers
// to pass to the MakeSignature call.
InputBufferDescriptor.cBuffers = 2;
InputBufferDescriptor.pBuffers = InputSecurityToken;
InputBufferDescriptor.ulVersion = SECBUFFER_VERSION;
//--------------------------------------------------------------------
// Build a security buffer for the message itself. If
// the SECBUFFER_READONLY attribute is set, the buffer will not be
// signed.
InputSecurityToken[0].BufferType = SECBUFFER_DATA;
InputSecurityToken[0].cbBuffer = MessageBufferSize;
InputSecurityToken[0].pvBuffer = MessageBuffer;
//--------------------------------------------------------------------
// Allocate and build a security buffer for the message
// signature.
InputSecurityToken[1].BufferType = SECBUFFER_TOKEN;
InputSecurityToken[1].cbBuffer = ContextSizes.cbMaxSignature;
InputSecurityToken[1].pvBuffer =
(void *)malloc(ContextSizes.cbMaxSignature);
//--------------------------------------------------------------------
// Call MakeSignature
// For the NTLM package, the sequence number need not be specified
// because the package provides sequencing.
// The quality of service parameter is ignored.
Ss = MakeSignature(
&phContext,
0, // no quality of service
&InputBufferDescriptor, // input message descriptor
0 // no sequence number
);
if (SEC_SUCCESS(ss))
{
printf("Have made a signature.\n");
}
else
{
MyHandleError("MakeSignature Failed.");
}
//--------------------------------------------------------------------
// Send the message.
if(!SendMsg(
s,
(BYTE *)InputSecurityToken[0].pvBuffer,
InputSecurityToken[0].cbBuffer))
{
MyHandleError("The message was not sent.");
}
//--------------------------------------------------------------------
// Send the signature.
if(!SendMsg(
s,
(BYTE *)InputSecurityToken[1].pvBuffer,
InputSecurityToken[1].cbBuffer ))
{
MyHandleError("The signature was not sent.");
}
如果內容設定為允許簽署訊息,而且輸入緩衝區描述項的格式正確,MakeSignature會傳回TRUE。 簽署訊息之後,訊息及其長度的簽章會傳送至遠端電腦。
注意
SecBuffer結構的資料內容會傳送,而不是SecBuffer結構本身或SecBufferDesc結構。 接收應用程式會建立新的 SecBuffer 結構和新的 SecBufferDesc 結構,以驗證簽章。