Bagikan melalui


Menandatangani Pesan

Ketika klien dan server selesai menyiapkan konteks keamanan , fungsi dukungan pesan dapat digunakan. Klien dan server menggunakan token konteks keamanan yang dibuat ketika sesi diinisiasi untuk memanggil MakeSignature dan VerifySignature fungsi. Token konteks dapat digunakan dengan EncryptMessage (Umum) dan DecryptMessage (Umum) untuk komunikasi privasi.

Contoh berikut menunjukkan sisi klien yang menghasilkan pesan yang ditandatangani untuk dikirim ke server. Sebelum memanggilMakeSignature , klien memanggil QueryContextAttributes (Umum) dengan struktur SecPkgContext_Sizes untuk menentukan panjang buffer yang diperlukan untuk menahan tanda tangan pesan. Jika anggota cbMaxSignature adalah nol, paket keamanan tidak mendukung pesan penandatanganan. Jika tidak, anggota ini menunjukkan ukuran buffer yang dialokasikan untuk menerima tanda tangan.

Contohnya mengasumsikan bahwa variabel SecHandle bernama phContext dan struktur SOCKET bernama s diinisialisasi. Untuk deklarasi dan inisiasi variabel ini, lihat Menggunakan SSPI dengan Windows Sockets Klien dan Menggunakan SSPI dengan Windows Sockets Server. Contoh ini mencakup panggilan ke fungsi dalam Secur32.lib, yang harus disertakan dalam daftar perpustakaan tautan.

//--------------------------------------------------------------------
//   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 mengembalikan TRUE jika konteks disiapkan untuk mengizinkan pesan penandatanganan dan jika deskriptor buffer input diformat dengan benar. Setelah pesan ditandatangani, pesan dan tanda tangan dengan panjangnya dikirim ke komputer jarak jauh.

Nota

Konten data struktur SecBuffer dikirim, bukan strukturnya SecBuffer maupun struktur SecBufferDesc. Struktur SecBuffer baru dan struktur SecBufferDesc baru dibuat oleh aplikasi penerima untuk memverifikasi tanda tangan.