Mémoires tampons supplémentaires retournées par Schannel
Les informations doivent être envoyées entre le client et le serveur pendant l’établissement d’un contexte de sécurité et par la suite, car les messages sécurisés sont échangés à l’aide des fonctionnalités de chiffrement et de déchiffrement fournies par Schannel. Les fonctions suivantes sont utilisées pour accomplir ces tâches :
Schannel a un ensemble bien défini de comportements pour les informations incomplètes ou excédentaires incluses dans les mémoires tampons d’entrée de ces fonctions. Les informations sont échangées entre le client et le serveur de la manière suivante :
- La partie locale interagit avec Schannel en appelant une fonction SSPI et en transmettant des informations. En règle générale, les informations ont été reçues de la partie distante.
- La fonction retourne un status code et des mémoires tampons de sortie contenant des informations.
- Selon le code status, les mémoires tampons de sortie sont envoyées à la partie distante au moyen d’un mécanisme de communication.
- La partie distante lit les informations envoyées par la partie locale.
- La boucle se répète, avec les parties locales et distantes échangées. (La partie distante appelle une fonction SSPI et transmet les informations lues à l’étape précédente.)
Tout fonctionne comme prévu lorsque la mémoire tampon d’entrée de la fonction SSPI contient exactement les informations nécessaires. Toutefois, en raison de la nature orientée flux de certains protocoles de communication, ce n’est peut-être pas le cas; un bloc d’informations reçu d’une partie distante peut contenir moins de données que celles requises ou plus de données que celles qui peuvent être traitées par Schannel dans un seul appel de fonction.
Si la mémoire tampon d’entrée contient trop peu d’informations, les fonctions retournent SEC_E_INCOMPLETE_MESSAGE. L’appelant doit obtenir des données supplémentaires de la partie distante et appeler à nouveau la fonction.
Lorsque les mémoires tampons d’entrée contiennent trop d’informations, Schannel ne traite pas cela comme une erreur. La fonction traite autant d’entrée que possible et retourne le code status pour cette activité de traitement. En outre, Schannel indique la présence d’informations non traitées dans les mémoires tampons d’entrée en retournant une mémoire tampon de sortie de type SECBUFFER_EXTRA. Le test des mémoires tampons de sortie pour ce type de mémoire tampon est le seul moyen de détecter cette situation. Le champ cbBuffer de la structure de mémoire tampon supplémentaire indique le nombre d’octets d’entrée non traités.
Notes
Le champ pvBuffer de la mémoire tampon supplémentaire ne contient pas de copie des données excédentaires.
Si vous recevez une mémoire tampon supplémentaire d’une fonction SSPI, vous devez supprimer les informations déjà traitées de la mémoire tampon d’entrée et appeler à nouveau la fonction. Schannel peut, et le fait souvent, retourner uniquement la mémoire tampon supplémentaire et rien d’autre dans les mémoires tampons de sortie.