Función CryptMsgControl (wincrypt.h)

La función CryptMsgControl realiza una operación de control después de descodificar un mensaje mediante una llamada final a la función CryptMsgUpdate . Las operaciones de control proporcionadas por esta función se usan para el descifrado, la firma y la comprobación de hash, y la adición y eliminación de certificados, listas de revocación de certificados (CRL), firmantes y atributos no autenticados.

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, vea los comentarios de la función CryptMsgOpenToEncode .

Sintaxis

BOOL CryptMsgControl(
  [in] HCRYPTMSG  hCryptMsg,
  [in] DWORD      dwFlags,
  [in] DWORD      dwCtrlType,
  [in] void const *pvCtrlPara
);

Parámetros

[in] hCryptMsg

Identificador de un mensaje criptográfico para el que se va a aplicar un control.

[in] dwFlags

El siguiente valor se define cuando el parámetro dwCtrlType es uno de los siguientes:

  • CMSG_CTRL_DECRYPT
  • CMSG_CTRL_KEY_TRANS_DECRYPT
  • CMSG_CTRL_KEY_AGREE_DECRYPT
  • CMSG_CTRL_MAIL_LIST_DECRYPT
Valor Significado
CMSG_CRYPT_RELEASE_CONTEXT_FLAG
El identificador del proveedor criptográfico se libera en la llamada final a la función CryptMsgClose . Este identificador no se libera si se produce un error en la función CryptMsgControl .
 

Si el parámetro dwCtrlType no especifica una operación de descifrado, establezca este valor en cero.

[in] dwCtrlType

Tipo de operación que se va a realizar. Los tipos de control de mensajes definidos actualmente y el tipo de estructura que se debe pasar al parámetro pvCtrlPara se muestran en la tabla siguiente.

Valor Significado
CMSG_CTRL_ADD_ATTR_CERT
14 (0xE)
Blob que contiene los bytes codificados del certificado de atributo.
CMSG_CTRL_ADD_CERT
10 (0xA)
Estructura CRYPT_INTEGER_BLOB que contiene los bytes codificados del certificado que se van a agregar al mensaje.
CMSG_CTRL_ADD_CMS_SIGNER_INFO
20 (0x14)
Estructura CMSG_CMS_SIGNER_INFO que contiene información del firmante. Esta operación difiere de CMSG_CTRL_ADD_SIGNER porque la información del firmante contiene la firma.
CMSG_CTRL_ADD_CRL
12 (0xC)
Blob que contiene los bytes codificados de la CRL que se van a agregar al mensaje.
CMSG_CTRL_ADD_SIGNER
6 (0x6)
Estructura CMSG_SIGNER_ENCODE_INFO que contiene la información del firmante que se va a agregar al mensaje.
CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR
8 (0x8)
Estructura CMSG_CTRL_ADD_SIGNER_UNAUTH_ATTR_PARA que contiene el índice del firmante y un BLOB que contiene la información de atributo no autenticada que se va a agregar al mensaje.
CMSG_CTRL_DECRYPT
2 (0x2)
Estructura CMSG_CTRL_DECRYPT_PARA utilizada para descifrar el mensaje para el destinatario de transporte de clave especificado. Este valor es aplicable a los destinatarios RSA. Esta operación especifica que la función CryptMsgControl busca en el índice del destinatario para obtener la información del destinatario del transporte de claves. Si se produce un error en la función, GetLastError devolverá CRYPT_E_INVALID_INDEX si no se encuentra ningún destinatario de transporte de claves.
CMSG_CTRL_DEL_ATTR_CERT
15 (0xF)
Índice del certificado de atributo que se va a quitar.
CMSG_CTRL_DEL_CERT
11 (0xB)
Índice del certificado que se va a eliminar del mensaje.
CMSG_CTRL_DEL_CRL
13 (0xD)
Índice de la CRL que se va a eliminar del mensaje.
CMSG_CTRL_DEL_SIGNER
7 (0x7)
Índice del firmante que se va a eliminar.
CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR
9 (0x9)
Estructura CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR_PARA que contiene un índice que especifica el firmante y el índice que especifica el atributo no autenticado del firmante que se va a eliminar.
CMSG_CTRL_ENABLE_STRONG_SIGNATURE
21 (0x15)
Estructura CERT_STRONG_SIGN_PARA utilizada para realizar comprobaciones de firmas seguras.

Para comprobar si hay una firma segura, especifique este tipo de control antes de llamar a CryptMsgGetAndVerifySigner o antes de llamar a CryptMsgControl con los siguientes tipos de control establecidos:

  • CMSG_CTRL_VERIFY_SIGNATURE
  • CMSG_CTRL_VERIFY_SIGNATURE_EX
Una vez comprobada correctamente la firma, esta función comprueba si hay una firma segura. Si la firma no es segura, se producirá un error en la operación y el valor GetLastError se establecerá en NTE_BAD_ALGID.
CMSG_CTRL_KEY_AGREE_DECRYPT
17 (0x11)
Estructura de CMSG_CTRL_KEY_AGREE_DECRYPT_PARA utilizada para descifrar el mensaje de la clave de sesión de acuerdo de clave especificada. El acuerdo de clave se usa con Diffie-Hellman cifrado o descifrado.
CMSG_CTRL_KEY_TRANS_DECRYPT
16 (0x10)
Estructura CMSG_CTRL_KEY_TRANS_DECRYPT_PARA utilizada para descifrar el mensaje para el destinatario de transporte de clave especificado. El transporte de claves se usa con cifrado y descifrado RSA.
CMSG_CTRL_MAIL_LIST_DECRYPT
18 (0x12)
Estructura de CMSG_CTRL_MAIL_LIST_DECRYPT_PARA utilizada para descifrar el mensaje del destinatario especificado mediante una clave de cifrado de clave (KEK) previamente distribuida.
CMSG_CTRL_VERIFY_HASH
5 (0x5)
Este valor no se utiliza.
CMSG_CTRL_VERIFY_SIGNATURE
1 (0x1)
Estructura CERT_INFO que identifica el firmante del mensaje cuya firma se va a comprobar.
CMSG_CTRL_VERIFY_SIGNATURE_EX
19 (0x13)
Estructura CMSG_CTRL_VERIFY_SIGNATURE_EX_PARA que especifica el índice del firmante y la clave pública para comprobar la firma del mensaje. La clave pública del firmante puede ser una estructura de CERT_PUBLIC_KEY_INFO , un contexto de certificado o un contexto de cadena de certificados.

[in] pvCtrlPara

Puntero a una estructura determinada por el valor de dwCtrlType.

valor dwCtrlType Significado
CMSG_CTRL_DECRYPT, CMSG_CTRL_KEY_TRANS_DECRYPT, CMSG_CTRL_KEY_AGREE_DECRYPT o CMSG_CTRL_MAIL_LIST_DECRYPT, y el mensaje sobre transmitido transmitido se está descodificando
La descodificación se realizará como si el contenido transmitido se descifrara. Si se ha acumulado algún contenido cifrado transmitido antes de esta llamada, parte o todo el texto no cifrado resultante del descifrado del texto cifrado se devuelve a la aplicación a través de la función de devolución de llamada especificada en la llamada a la función CryptMsgOpenToDecode .
Nota Al transmitir un mensaje sobre, no se llama a la función CryptMsgControl hasta que el sondeo de la disponibilidad del CMSG_ENVELOPE_ALGORITHM_PARAM se realiza correctamente. Si el sondeo no se realiza correctamente, se produce un error. Para obtener una descripción de ese sondeo, consulte la función CryptMsgOpenToDecode .
 
CMSG_CTRL_VERIFY_HASH
El hash calculado a partir del contenido del mensaje se compara con el hash contenido del mensaje.
CMSG_CTRL_ADD_SIGNER
pvCtrlPara apunta a una estructura de CMSG_SIGNER_ENCODE_INFO que contiene la información del firmante que se va a agregar al mensaje.
CMSG_CTRL_DEL_SIGNER
Una vez realizada una eliminación, cualquier otro índice de firmante en uso para este mensaje ya no es válido y se debe volver a adquirir llamando a la función CryptMsgGetParam .
CMSG_CTRL_DEL_SIGNER_UNAUTH_ATTR
Una vez realizada una eliminación, cualquier otro índice de atributo no autenticado en uso para este firmante ya no es válido y debe volver a adquirirse mediante una llamada a la función CryptMsgGetParam .
CMSG_CTRL_DEL_CERT
Una vez realizada una eliminación, cualquier otro índice de certificado en uso para este mensaje ya no es válido y debe volver a adquirirse mediante una llamada a la función CryptMsgGetParam .
CMSG_CTRL_DEL_CRL
Una vez realizada una eliminación, cualquier otro índice CRL que se use para este mensaje ya no es válido y tendrá que volver a adquirirse mediante una llamada a la función CryptMsgGetParam .

Valor devuelto

Si la función se realiza correctamente, el valor devuelto es distinto de cero.

Si se produce un error en la función, el valor devuelto es cero y la función GetLastError devuelve un error de codificación y descodificación de sintaxis abstracta uno (ASN.1). Para obtener información sobre estos errores, vea Valores devueltos de codificación y descodificación de ASN.1.

Cuando se descodifica un mensaje sobre, se descodifican los errores encontrados en la función de devolución de llamada definida por la aplicación especificada por el parámetro pStreamInfo del
La función CryptMsgOpenToDecode se puede propagar a la función CryptMsgControl . Si esto sucede, la función CryptMsgControl no llama a la función SetLastError después de que se devuelva la función de devolución de llamada. Esto conserva los errores detectados bajo el control de la aplicación. Es responsabilidad de la función de devolución de llamada (o una de las API a las que llama) llamar a la función SetLastError si se produce un error mientras la aplicación procesa los datos transmitidos.

Es posible que se produzcan errores propagados desde las siguientes funciones:

Los códigos de error siguientes se devuelven con más frecuencia.

Código devuelto Descripción
CRYPT_E_ALREADY_DECRYPTED
El contenido del mensaje ya se ha descifrado. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_DECRYPT.
CRYPT_E_AUTH_ATTR_MISSING
El mensaje no contiene un atributo autenticado esperado. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_VERIFY_SIGNATURE.
CRYPT_E_BAD_ENCODE
Error al codificar o descodificar. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_VERIFY_SIGNATURE.
CRYPT_E_CONTROL_TYPE
El tipo de control no es válido.
CRYPT_E_HASH_VALUE
El valor hash es incorrecto.
CRYPT_E_INVALID_INDEX
El valor del índice no es válido.
CRYPT_E_INVALID_MSG_TYPE
Tipo de mensaje no válido.
CRYPT_E_OID_FORMAT
El identificador de objeto tiene un formato incorrecto. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_ADD_SIGNER.
CRYPT_E_RECIPIENT_NOT_FOUND
El mensaje de datos sobres no contiene el destinatario especificado. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_DECRYPT.
CRYPT_E_SIGNER_NOT_FOUND
No se encontró el firmante especificado para el mensaje. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_VERIFY_SIGNATURE.
CRYPT_E_UNKNOWN_ALGO
El algoritmo criptográfico es desconocido.
CRYPT_E_UNEXPECTED_ENCODING
El mensaje no está codificado según lo previsto. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_VERIFY_SIGNATURE.
E_INVALIDARG
Uno o varios argumentos no son válidos. Este error se puede devolver si el parámetro dwCtrlType está establecido en CMSG_CTRL_DECRYPT.
E_OUTOFMEMORY
No había suficiente memoria disponible para completar la operación.

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

Consulte también

Funciones de mensaje de bajo nivel

Funciones de mensaje simplificadas