Función CryptMsgOpenToDecode (wincrypt.h)
La función CryptMsgOpenToDecode abre un mensaje criptográfico para descodificar y devuelve un identificador del mensaje abierto. El mensaje permanece abierto hasta que se llama a la función CryptMsgClose .
Se han realizado cambios importantes que afectan al control de mensajes sobres en CryptoAPI para admitir la interoperabilidad de correo electrónico seguro/multipropósito de extensiones de correo de Internet (S/MIME). Para obtener más información, consulte la sección Comentarios de CryptMsgOpenToEncode.
Sintaxis
HCRYPTMSG CryptMsgOpenToDecode(
[in] DWORD dwMsgEncodingType,
[in] DWORD dwFlags,
[in] DWORD dwMsgType,
[in] HCRYPTPROV_LEGACY hCryptProv,
[in] PCERT_INFO pRecipientInfo,
[in, optional] PCMSG_STREAM_INFO pStreamInfo
);
Parámetros
[in] dwMsgEncodingType
Especifica el tipo de codificación utilizado. Siempre es aceptable especificar los tipos de codificación de certificados y mensajes mediante su combinación con una operación OR bit a bit, como se muestra en el ejemplo siguiente:
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING
Los tipos de codificación definidos actualmente son:
- X509_ASN_ENCODING
- PKCS_7_ASN_ENCODING
[in] dwFlags
Este parámetro puede ser una de las marcas siguientes.
Valor | Significado |
---|---|
|
Indica que el mensaje que se va a descodificar está desasociado. Si no se establece esta marca, el mensaje no se desasocia. |
|
Si se establece, el hCryptProv pasado a esta función se libera en el CryptMsgUpdate final. El identificador no se libera si se produce un error en la función. |
[in] dwMsgType
Especifica el tipo de mensaje que se va a descodificar. En la mayoría de los casos, el tipo de mensaje se determina a partir del encabezado del mensaje y se pasa cero para este parámetro. En algunos casos, especialmente con Internet Explorer 3.0, los mensajes no tienen encabezados y el tipo de mensaje que se va a descodificar debe proporcionarse en esta llamada de función. Si falta el encabezado y se pasa cero para este parámetro, se produce un error en la función.
Este parámetro puede ser uno de los siguientes tipos de mensajes predefinidos.
[in] hCryptProv
Este parámetro no se usa y debe establecerse en NULL.
Windows Server 2003 y Windows XP: Especifica un identificador para que el proveedor criptográfico use para aplicar un algoritmo hash al mensaje. En el caso de los mensajes firmados, hCryptProv se usa para la comprobación de firmas. El tipo de datos de este parámetro es HCRYPTPROV.
A menos que haya un motivo seguro para pasar un proveedor criptográfico específico en hCryptProv, establezca este parámetro en NULL. Pasar NULL hace que el proveedor RSA o DSS predeterminado se adquiera antes de realizar operaciones de hash, comprobación de firma o cifrado de destinatarios.
[in] pRecipientInfo
Este parámetro está reservado para uso futuro y debe ser NULL.
[in, optional] pStreamInfo
Cuando no se usa el streaming, este parámetro debe establecerse en NULL.
Cuando se usa el streaming, el parámetro pStreamInfo es un puntero a una estructura de CMSG_STREAM_INFO que contiene un puntero a una devolución de llamada a la que se llamará cuando se ejecuta CryptMsgUpdate o cuando se ejecuta CryptMsgControl al descodificar un mensaje sobre transmitido en secuencias.
Para un mensaje firmado, la devolución de llamada se pasa a un bloque de los bytes descodificados del contenido interno del mensaje.
Para un mensaje sobre, después de cada llamada a CryptMsgUpdate, debe comprobar si la propiedad CMSG_ENVELOPE_ALGORITHM_PARAM está disponible llamando a la función CryptMsgGetParam . Se producirá un error en CryptMsgGetParam y GetLastError devolverá CRYPT_E_STREAM_MSG_NOT_READY hasta que CryptMsgUpdate haya procesado suficiente el mensaje para que la propiedad CMSG_ENVELOPE_ALGORITHM_PARAM esté disponible. Cuando la propiedad CMSG_ENVELOPE_ALGORITHM_PARAM está disponible, puede recorrer en iteración los destinatarios, recuperando una estructura de CERT_INFO para cada destinatario mediante la función CryptMsgGetParam para recuperar la propiedad CMSG_RECIPIENT_INFO_PARAM. Para evitar un ataque por denegación de servicio de un mensaje sobre que tiene un bloque de encabezado artificialmente grande, debe realizar un seguimiento de la cantidad de memoria que se ha pasado a la función CryptMsgUpdate durante este proceso. Si la cantidad de datos supera un límite definido por la aplicación antes de que la propiedad CMSG_ENVELOPE_ALGORITHM_PARAM esté disponible, debe detener el procesamiento del mensaje y llamar a la función CryptMsgClose para que el sistema operativo libere cualquier memoria asignada para el mensaje. Un límite sugerido es el tamaño máximo permitido de un mensaje. Por ejemplo, si el tamaño máximo del mensaje es de 10 MB, el límite de esta prueba debe ser de 10 MB.
La estructura CERT_INFO se usa para buscar un certificado coincidente en un almacén de certificados abierto previamente mediante la función CertGetSubjectCertificateFromStore . Cuando se encuentra el certificado correcto, se llama a la función CertGetCertificateContextProperty con un parámetro CERT_KEY_PROV_INFO_PROP_ID para recuperar una estructura CRYPT_KEY_PROV_INFO . La estructura contiene la información necesaria para adquirir la clave privada del destinatario mediante una llamada a CryptAcquireContext mediante los miembros pwszContainerName, pwszProvName, dwProvType y dwFlags de la estructura CRYPT_KEY_PROV_INFO . El hCryptProv adquirido y el miembro dwKeySpec de la estructura CRYPT_KEY_PROV_INFO se pasan a la estructura CryptMsgControl como miembro de la estructura CMSG_CTRL_DECRYPT_PARA para permitir el inicio del descifrado del contenido interno. A continuación, el código de streaming realizará el descifrado a medida que se introducen los datos. Los bloques resultantes de texto no cifrado se pasan a la función de devolución de llamada especificada por el miembro pfnStreamOutput de la estructura CMSG_STREAM_INFO para controlar la salida del mensaje descifrado.
En el caso de un mensaje firmado incluido en un mensaje sobre, la salida de texto no cifrado de la descodificación de streaming del mensaje sobre se puede introducir en otra descodificación de streaming para procesar el mensaje firmado.
Valor devuelto
Si la función se ejecuta correctamente, la función devuelve el identificador del mensaje abierto.
Si se produce un error en la función, devuelve NULL. Para obtener información de error extendida, llame a GetLastError.
En la tabla siguiente se enumeran los códigos de error devueltos normalmente por la función GetLastError .
Valor | Descripción |
---|---|
|
Uno o varios argumentos no son válidos. |
|
Error de asignación de memoria. |
Requisitos
Requisito | Value |
---|---|
Cliente mínimo compatible | Windows XP [aplicaciones de escritorio | aplicaciones para UWP] |
Servidor mínimo compatible | Windows Server 2003 [aplicaciones de escritorio | aplicaciones para UWP] |
Plataforma de destino | Windows |
Encabezado | wincrypt.h |
Library | Crypt32.lib |
Archivo DLL | Crypt32.dll |