Búferes adicionales devueltos por Schannel
La información debe enviarse entre el cliente y el servidor mientras se establece y después se establece un contexto de seguridad , ya que los mensajes seguros se intercambian mediante las características de cifrado y descifrado proporcionadas por Schannel. Las siguientes funciones se usan para realizar estas tareas:
Schannel tiene un conjunto bien definido de comportamientos para información incompleta o excesiva incluida en los búferes de entrada para estas funciones. La información se intercambia entre el cliente y el servidor de la siguiente manera:
- El usuario local interactúa con Schannel llamando a una función SSPI y pasando información. Normalmente, la información se recibió de la parte remota.
- La función devuelve un código de estado y búferes de salida que contienen información.
- Dependiendo del código de estado, los búferes de salida se envían a la parte remota mediante algún mecanismo de comunicación.
- La parte remota lee la información enviada por la parte local.
- El bucle se repite, con las partes locales y remotas intercambiadas. (La entidad remota llama a una función SSPI y pasa la información leída en el paso anterior).
Todo funciona según lo esperado cuando el búfer de entrada a la función SSPI contiene exactamente la información necesaria. Sin embargo, debido a la naturaleza orientada a la transmisión de algunos protocolos de comunicación, esto puede no ser el caso; Un bloque de información recibida de una entidad remota puede contener menos datos de los necesarios o más datos de los que Schannel puede procesar en una sola llamada de función.
Si el búfer de entrada contiene demasiado poca información, las funciones devuelven SEC_E_INCOMPLETE_MESSAGE. El autor de la llamada debe obtener datos adicionales de la entidad remota y volver a llamar a la función.
Cuando los búferes de entrada contienen demasiada información, Schannel no trata esto como un error. La función procesa la mayor parte de la entrada que pueda y devuelve el código de estado de esa actividad de procesamiento. Además, Schannel indica la presencia de información no procesada en los búferes de entrada devolviendo un búfer de salida de tipo SECBUFFER_EXTRA. Probar los búferes de salida para este tipo de búfer es la única manera de detectar esta situación. El campo cbBuffer de la estructura de búfer adicional indica cuántos bytes de entrada no se procesaron.
Nota:
El campo pvBuffer del búfer adicional no contiene una copia de los datos excesivos.
Si recibe un búfer adicional de una función SSPI, debe quitar la información ya procesada del búfer de entrada y volver a llamar a la función. Schannel puede, y a menudo, devolver solo el búfer adicional y nada más en los búferes de salida.