Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Gdy klient i serwer zakończą konfigurowanie kontekstu zabezpieczeń , można użyć funkcji obsługi komunikatów. Klient i serwer używają tokenu kontekstu zabezpieczeń utworzonego podczas nawiązywania sesji w celu wywołania funkcji MakeSignature i VerifySignature. Token kontekstu może być używany z EncryptMessage (Ogólne) i DecryptMessage (Ogólne) w celu zapewnienia prywatności komunikacji .
Poniższy przykład przedstawia stronę klienta generującą podpisany komunikat do wysłania na serwer. Przed wywołaniem MakeSignature klient wywołuje QueryContextAttributes (Ogólne) ze strukturą SecPkgContext_Sizes w celu określenia długości buforu wymaganego do przechowywania podpisu wiadomości. Jeśli członek cbMaxSignature ma wartość zero, pakiet zabezpieczeń nie obsługuje podpisywania komunikatów. W przeciwnym razie ten członek wskazuje rozmiar buforu do przydzielenia do odbioru podpisu.
W przykładzie przyjęto założenie, że zmienna SecHandle o nazwie phContext oraz struktura SOCKET o nazwie s są zainicjalizowane. Aby uzyskać deklaracje i inicjalizacje tych zmiennych, zobacz Korzystanie z SSPI z klientem Windows Sockets oraz Korzystanie z SSPI z serwerem Windows Sockets. Ten przykład obejmuje wywołania funkcji w pliku Secur32.lib, które muszą być uwzględnione w bibliotekach linków.
//--------------------------------------------------------------------
// 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 zwraca true, jeśli kontekst jest skonfigurowany tak, aby zezwalał na podpisywanie komunikatów i czy deskryptor buforu wejściowego jest poprawnie sformatowany. Po podpisaniu komunikatu wiadomość i podpis o ich długości są wysyłane do komputera zdalnego.
Notatka
Zawartość danych struktur SecBuffer jest wysyłana, a nie struktura SecBuffer ani struktura SecBufferDesc. Nowe struktury SecBuffer i nowe struktury SecBufferDesc są tworzone przez aplikację odbierającego w celu zweryfikowania podpisu.