Udostępnij za pośrednictwem


Dodatkowe zwrócone przez Schannel

Informacje muszą być wysyłane między klientem a serwerem, podczas gdy kontekst zabezpieczeń jest ustanawiany, a następnie, ponieważ bezpieczne komunikaty są wymieniane przy użyciu funkcji szyfrowania i odszyfrowywania udostępnianych przez usługę Schannel. Następujące funkcje służą do wykonywania tych zadań:

Schannel ma dobrze zdefiniowany zestaw zachowań dla niekompletnych lub nadmiarowych informacji zawartych w wejściowych do tych funkcji. Informacje są wymieniane między klientem a serwerem w następujący sposób:

  1. Lokalna strona współdziała z usługą Schannel, wywołując funkcję SSPI i przekazując informacje. Zazwyczaj informacje zostały odebrane od strony zdalnej.
  2. Funkcja zwraca kod stanu i wyjściowe zawierające informacje.
  3. W zależności od kodu stanu wyjściowe są wysyłane do strony zdalnej za pomocą pewnego mechanizmu komunikacyjnego.
  4. Strona zdalna odczytuje informacje wysyłane przez stronę lokalną.
  5. Pętla powtarza się z wymianą lokalnych i zdalnych stron. (Strona zdalna wywołuje funkcję SSPI i przekazuje informacje odczytane w poprzednim kroku).

Wszystko działa zgodnie z oczekiwaniami, gdy bufor wejściowy do funkcji SSPI zawiera dokładnie wymagane informacje. Jednak ze względu na charakter strumieniowy niektórych protokołów komunikacyjnych może to nie być możliwe; blok informacji otrzymanych od strony zdalnej może zawierać mniej danych niż jest to wymagane lub więcej danych niż można przetworzyć przez Schannel w jednym wywołaniu funkcji.

Jeśli bufor wejściowy zawiera zbyt mało informacji, funkcje zwracają SEC_E_INCOMPLETE_MESSAGE. Obiekt wywołujący musi uzyskać dodatkowe dane od strony zdalnej i ponownie wywołać funkcję.

Jeśli wejściowe zawierają zbyt wiele informacji, Schannel nie traktuje tego jako błędu. Funkcja przetwarza tyle danych wejściowych, ile może, i zwraca kod stanu dla tego działania przetwarzania. Ponadto Schannel wskazuje obecność nieprzetworzonych informacji w wejściowych przez zwrócenie buforu wyjściowego typu SECBUFFER_EXTRA. Testowanie wyjściowych dla tego typu buforu jest jedynym sposobem wykrywania tej sytuacji. Pole cbBuffer dodatkowej struktury buforu wskazuje, ile bajtów danych wejściowych nie zostało przetworzonych.

Nuta

Pole pvBuffer dodatkowego buforu nie zawiera kopii nadmiarowych danych.

 

Jeśli otrzymasz dodatkowy bufor z funkcji SSPI, musisz usunąć już przetworzone informacje z buforu wejściowego i wywołać funkcję ponownie. Schannel może i często zwraca tylko dodatkowy bufor i nic innego w wyjściowych.