Función CryptDecodeMessage (wincrypt.h)

La función CryptDecodeMessage descodifica, descifra y comprueba un mensaje criptográfico.

Esta función se puede usar cuando se desconoce el tipo de mensaje criptográfico. Las constantes dwMsgTypeFlags se pueden combinar con una operación OR bit a bit para que la función intente encontrar uno de los tipos. Cuando se encuentra uno de los tipos, la función notifica el tipo encontrado y devuelve los datos adecuados para ese tipo.

En cada paso, la función descifra solo un nivel de cifrado o codificación. Para el descifrado adicional, esta función o una de las otras funciones de mensaje simplificadas debe llamarse de nuevo.

Sintaxis

BOOL CryptDecodeMessage(
  [in]                DWORD                       dwMsgTypeFlags,
  [in]                PCRYPT_DECRYPT_MESSAGE_PARA pDecryptPara,
  [in]                PCRYPT_VERIFY_MESSAGE_PARA  pVerifyPara,
  [in]                DWORD                       dwSignerIndex,
  [in]                const BYTE                  *pbEncodedBlob,
  [in]                DWORD                       cbEncodedBlob,
  [in]                DWORD                       dwPrevInnerContentType,
  [out, optional]     DWORD                       *pdwMsgType,
  [out, optional]     DWORD                       *pdwInnerContentType,
  [out, optional]     BYTE                        *pbDecoded,
  [in, out, optional] DWORD                       *pcbDecoded,
  [out, optional]     PCCERT_CONTEXT              *ppXchgCert,
  [out, optional]     PCCERT_CONTEXT              *ppSignerCert
);

Parámetros

[in] dwMsgTypeFlags

Indica el tipo de mensaje. Los tipos de mensaje se pueden combinar con el operador OR bit a bit. Este parámetro puede ser uno de los siguientes tipos de mensaje:

  • CMSG_DATA_FLAG
  • CMSG_SIGNED_FLAG
  • CMSG_ENVELOPED_FLAG
  • CMSG_SIGNED_AND_ENVELOPED_FLAG
  • CMSG_HASHED_FLAG
Nota Después de la devolución, el valor DWORD al que apunta pdwMsgType se establece con el tipo del mensaje.
 

[in] pDecryptPara

Puntero a una estructura de CRYPT_DECRYPT_MESSAGE_PARA que contiene parámetros de descifrado.

[in] pVerifyPara

Puntero a una estructura de CRYPT_VERIFY_MESSAGE_PARA que contiene parámetros de comprobación.

[in] dwSignerIndex

Indica qué firmante, entre los posibles firmantes de un mensaje, se va a comprobar. Este índice se puede cambiar en varias llamadas a la función para comprobar los firmantes adicionales.

dwSignerIndex se establece en cero para el primer firmante. Si la función devuelve FALSE y GetLastError devuelve CRYPT_E_NO_SIGNER, la llamada anterior devolvió el último firmante del mensaje. Este parámetro solo se usa con mensajes de tipos CMSG_SIGNED_AND_ENVELOPED o CMSG_SIGNED. Para todos los demás tipos de mensajes, debe establecerse en cero.

[in] pbEncodedBlob

Puntero al BLOB codificado que se va a descodificar.

[in] cbEncodedBlob

Tamaño, en bytes, del BLOB codificado.

[in] dwPrevInnerContentType

Solo es aplicable cuando se procesan mensajes criptográficos anidados. Al procesar un mensaje criptográfico externo, debe establecerse en cero. Al descodificar un mensaje criptográfico anidado, se establece en el valor devuelto en pdwInnerContentType mediante una llamada anterior de CryptDecodeMessage para el mensaje externo. Puede ser cualquiera de los tipos de CMSG enumerados en pdwMsgType. Para la compatibilidad con versiones anteriores, establezca dwPrevInnerContentType en cero.

[out, optional] pdwMsgType

Puntero a un DWORD que especifica el tipo de mensaje devuelto. Este parámetro puede ser uno de los siguientes tipos de mensaje:

  • CMSG_DATA
  • CMSG_SIGNED
  • CMSG_ENVELOPED
  • CMSG_SIGNED_AND_ENVELOPED
  • CMSG_HASHED

[out, optional] pdwInnerContentType

Puntero a un DWORD que especifica el tipo de un mensaje interno. Los códigos de tipo de mensaje usados para pdwMsgType también se usan aquí.

Si no hay ningún anidamiento criptográfico, se devuelve CMSG_DATA.

[out, optional] pbDecoded

Puntero a un búfer para recibir el mensaje descodificado.

Este parámetro puede ser NULL si el mensaje descodificado no es necesario o para establecer el tamaño del mensaje descodificado con fines de asignación de memoria. No se devolverá un mensaje descodificado si este parámetro es NULL. Para obtener más información, vea Recuperación de datos de longitud desconocida.

[in, out, optional] pcbDecoded

Puntero a una variable que especifica el tamaño, en bytes, del búfer al que apunta el parámetro pbDecoded . Cuando se devuelve la función, esta variable contiene el tamaño del mensaje descodificado.

Nota Al procesar los datos devueltos en el búfer, las aplicaciones deben usar el tamaño real de los datos devueltos. El tamaño real puede ser ligeramente menor que el tamaño del búfer especificado en la entrada. (En la entrada, los tamaños del búfer suelen especificarse lo suficientemente grandes como para asegurarse de que los datos de salida más grandes posibles caben en el búfer). En la salida, la variable a la que apunta este parámetro se actualiza para reflejar el tamaño real de los datos copiados en el búfer.
 

[out, optional] ppXchgCert

Puntero a un puntero a una estructura de CERT_CONTEXT con un certificado que corresponde a la clave de intercambio privada necesaria para descodificar el mensaje. Este parámetro solo se establece para los tipos de mensaje CMSG_ENVELOPED y CMSG_SIGNED_AND_ENVELOPED.

[out, optional] ppSignerCert

Puntero a un puntero a una estructura CERT_CONTEXT del contexto de certificado del firmante. Este parámetro solo se establece para los tipos de mensaje CMSG_SIGNED y CMSG_SIGNED_AND_ENVELOPED.

Valor devuelto

Si la función se ejecuta correctamente, la función devuelve un valor distinto de cero (TRUE).

Si se produce un error en la función, devuelve cero (FALSE). Para obtener información de error extendida, llame a GetLastError.

Las funciones CryptDecryptMessage, CryptVerifyMessageSignature o CryptVerifyMessageHash se pueden propagar a esta función.

Normalmente, la función GetLastError devuelve el código de error siguiente.

Código devuelto Descripción
ERROR_MORE_DATA
Si el búfer especificado por el parámetro pbDecoded no es lo suficientemente grande como para contener los datos devueltos, la función establece el código ERROR_MORE_DATA y almacena el tamaño de búfer necesario, en bytes, en la variable a la que apunta pcbDecoded.

Comentarios

El parámetro dwMsgTypeFlags especifica el conjunto de mensajes permitidos. Por ejemplo, para descodificar mensajes SIGNED o ENVELOPED, establezca dwMsgTypeFlags en CMSG_SIGNED_FLAG | CMSG_ENVELOPED_FLAG. Se deben especificar los parámetros pDecryptPara o pVerifyPara o ambos .

Para un mensaje descodificado o comprobado correctamente, se actualizan los punteros de contexto de certificado a los que apunta ppXchgCert y ppSignerCert . Deben liberarse llamando a CertFreeCertificateContext. Si se produce un error en la función, se establecen en NULL.

Los parámetros ppXchgCert o ppSignerCert se pueden establecer en NULL antes de llamar a la función, lo que indica que el autor de la llamada no está interesado en obtener el certificado de intercambio o el contexto del certificado del firmante.

Requisitos

Requisito Value
Cliente mínimo compatible Windows XP [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows Server 2003 [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado wincrypt.h
Library Crypt32.lib
Archivo DLL Crypt32.dll

Consulte también

CryptDecryptMessage

CryptVerifyMessageHash

CryptVerifyMessageSignature

Funciones de mensaje simplificadas