Von Schannel zurückgegebene zusätzliche Puffer
Informationen müssen zwischen Client und Server gesendet werden, während ein Sicherheitskontext eingerichtet wird und anschließend, da sichere Nachrichten mithilfe der von Schannel bereitgestellten Ver- und Entschlüsselungsfunktionen ausgetauscht werden. Die folgenden Funktionen werden verwendet, um diese Aufgaben auszuführen:
Schannel verfügt über einen klar definierten Satz von Verhaltensweisen für unvollständige oder überschüssige Informationen, die in den Eingabepuffern für diese Funktionen enthalten sind. Der Informationsaustausch zwischen Client und Server erfolgt auf folgende Weise:
- Die lokale Partei interagiert mit Schannel, indem sie eine SSPI-Funktion aufruft und Informationen übergibt. In der Regel wurden die Informationen von der Remotepartei empfangen.
- Die Funktion gibt einen status Code und Ausgabepuffer zurück, die Informationen enthalten.
- Je nach status Code werden die Ausgabepuffer mithilfe eines Kommunikationsmechanismus an die Remotepartei gesendet.
- Die Remotepartei liest Informationen, die von der lokalen Partei gesendet werden.
- Die Schleife wird wiederholt, wobei die lokale und die Remote-Parteien ausgetauscht werden. (Die Remotepartei ruft eine SSPI-Funktion auf und übergibt die im vorherigen Schritt gelesenen Informationen.)
Alles funktioniert wie erwartet, wenn der Eingabepuffer für die SSPI-Funktion genau die erforderlichen Informationen enthält. Aufgrund der streamorientierten Natur einiger Kommunikationsprotokolle ist dies jedoch möglicherweise nicht der Fall; Ein Informationsblock, der von einer Remotepartei empfangen wird, kann weniger Daten enthalten, als erforderlich sind, oder mehr Daten als von Schannel in einem einzigen Funktionsaufruf verarbeitet werden können.
Wenn der Eingabepuffer zu wenig Informationen enthält, geben die Funktionen SEC_E_INCOMPLETE_MESSAGE zurück. Der Aufrufer muss zusätzliche Daten von der Remotepartei abrufen und die Funktion erneut aufrufen.
Wenn die Eingabepuffer zu viele Informationen enthalten, behandelt Schannel dies nicht als Fehler. Die Funktion verarbeitet so viele Eingaben wie möglich und gibt den status Code für diese Verarbeitungsaktivität zurück. Darüber hinaus gibt Schannel das Vorhandensein nicht verarbeiteter Informationen in den Eingabepuffern an, indem ein Ausgabepuffer vom Typ SECBUFFER_EXTRA zurückgegeben wird. Das Testen der Ausgabepuffer für diesen Puffertyp ist die einzige Möglichkeit, diese Situation zu erkennen. Das Feld cbBuffer der zusätzlichen Pufferstruktur gibt an, wie viele Bytes der Eingabe nicht verarbeitet wurden.
Hinweis
Das pvBuffer-Feld des zusätzlichen Puffers enthält keine Kopie der überschüssigen Daten.
Wenn Sie einen zusätzlichen Puffer von einer SSPI-Funktion erhalten, müssen Sie die bereits verarbeiteten Informationen aus dem Eingabepuffer entfernen und die Funktion erneut aufrufen. Schannel kann und gibt häufig nur den zusätzlichen Puffer und sonst nichts in den Ausgabepuffern zurück.