Uso de SecBufferDesc y SecBuffer
La comunicación suele implicar grandes cantidades de datos o datos de longitud desconocida. El envío y la recepción de datos se realizan de forma similar o idéntica en ambos casos. Para tratar con una longitud desconocida y cantidades potencialmente grandes de datos, la comunicación de SSPI se realiza mediante dos estructuras, SecBufferDesc y SecBuffer.
Una estructura SecBufferDesc es un contenedor para una matriz de estructuras SecBuffer . Una estructura SecBufferDesc tiene los siguientes miembros:
Una estructura SecBuffer contiene los tres miembros siguientes:
- Número de bytes en el búfer
- Tipo de información contenida en el elemento de datos
- Los propios bytes
Un mensaje SSPI completo suele constar de una matriz de estructuras SecBuffer .
Los siguientes tipos de datos de búfer se definen de la siguiente manera.
Tipo de búfer | Significado |
---|---|
SECBUFFER_EMPTY | Sin definir, reemplazado por la función de paquete de seguridad |
SECBUFFER_DATA | Datos de paquetes |
SECBUFFER_TOKEN | Token de seguridad |
SECBUFFER_PKG_PARAMS | Parámetros específicos del paquete |
SECBUFFER_MISSING | Indicador de datos que falta |
SECBUFFER_EXTRA | Datos adicionales |
SECBUFFER_STREAM | Datos de flujo de seguridad |
SECBUFFER_STREAM_TRAILER | Finalizador de flujo de seguridad |
SECBUFFER_STREAM_HEADER | Encabezado de flujo de seguridad |
Los tipos de búfer anteriores se pueden combinar mediante una operación OR bit a bit con cualquiera de los siguientes tipos de búfer.
Tipo de búfer | Significado |
---|---|
SECBUFFER_ATTRMASK | Enmascarar los atributos de seguridad separando las marcas de atributo del tipo de búfer. |
SECBUFFER_READONLY | El búfer es de solo lectura |
Antes de cada llamada a una API de SSPI que requiera un parámetro SecBufferDesc , se declaran e inicializan uno o varios elementos de la matriz SecBuffer . Por ejemplo, puede haber dos búferes de seguridad: uno que contiene datos de mensajes de entrada y el otro para el token de seguridad opaco de salida devuelto por el paquete de seguridad. El orden de los búferes de seguridad en el descriptor del búfer de seguridad no es importante, pero cada búfer debe etiquetarse con su tipo adecuado. Una etiqueta de solo lectura se puede usar con cualquier búfer de entrada que el paquete de seguridad no debe modificar.
El tamaño del búfer de salida que se espera que contenga el token de seguridad es importante. Una aplicación puede encontrar el tamaño máximo del token para un paquete de seguridad durante la instalación inicial. La llamada a EnumerateSecurityPackages devuelve una matriz de punteros a la información del paquete de seguridad. La estructura de información del paquete de seguridad contiene el tamaño máximo del token para cada paquete. En el ejemplo, la información se encuentra en el miembro cbMaxToken de la estructura SecPkgInfo . La misma información se puede obtener más adelante mediante QuerySecurityPackageInfo.
La aplicación inicializa los punteros y tamaños del búfer en la descripción del búfer para indicar dónde se pueden encontrar los datos del mensaje y otra información.
Para obtener más información, consulte SecBuffer y SecBufferDesc Example Code (Código de ejemplo de SecBuffer y SecBufferDesc).