Codificación de datos firmados

Los datos firmados constan de contenido de cualquier tipo y hash de mensajes cifrados del contenido por cero o más firmantes. El hash resultante puede confirmar que el mensaje original no se ha modificado desde la firma y que determinadas personas o entidades han firmado los datos.

En la ilustración siguiente se muestra el procedimiento para codificar un mensaje firmado. En la lista siguiente se describen los pasos.

Un mensaje puede tener varios firmantes, algoritmos hash y certificados. Aunque en la ilustración solo se muestran los certificados, las CRL y las CTL pueden usar el mismo proceso. Caben en la ilustración donde se muestran los certificados.

codificación de un mensaje firmado

El proceso general para codificar datos firmados es el siguiente.

Para codificar datos firmados

  1. Los datos se crean (si es necesario) y se recupera un puntero a ellos.
  2. Se abre un almacén de certificados que contiene el certificado del firmante.
  3. Se recupera la clave privada del certificado. Hay dos propiedades que se deben establecer en el certificado antes de usarla. Se usa para vincular un certificado a un CSP determinado y, dentro de ese CSP, a un contenedor de clave privada determinado. El otro se usa para indicar qué algoritmo hash se va a usar cuando se llama a una operación hash . Solo se deben establecer una vez.
  4. La propiedad de un certificado determina el algoritmo hash.
  5. Un hash de los datos se crea mediante el envío de los datos a través de la función hash.
  6. La firma se crea mediante el cifrado del hash mediante la clave privada, obtenida a través de una propiedad en el certificado.
  7. Los datos siguientes se incluyen en el mensaje terminado firmado:
    • Datos originales que se van a firmar
    • Algoritmos hash
    • Firmas
    • Estructuras de información del firmante, que incluye el identificador del firmante (emisor de certificados y número de serie)
    • Certificados del firmante (opcional)

Este procedimiento ilustra un caso sencillo. Los casos más complejos implican atributos autenticados incluidos en el mensaje. Cuando el tipo de contenido es cualquier cosa, pero una cadena BYTE , o hay al menos un atributo autenticado junto con cualquier tipo de datos, hay dos atributos autenticados estándar necesarios: el tipo de contenido (datos) y el hash del contenido. En estas circunstancias, CryptoAPI proporciona automáticamente estos dos atributos necesarios. Las funciones de mensaje de bajo nivel hash de los atributos autenticados, cifran el hash con la clave privada y proporcionan esto como firma.

Use las funciones de mensaje de bajo nivel para realizar las tareas que acaba de enumerar mediante el procedimiento siguiente.

Para codificar un mensaje firmado

  1. Cree o recupere el contenido.

  2. Obtenga un proveedor criptográfico.

  3. Obtenga los certificados de firmante.

  4. Inicialice la estructura CMSG_SIGNER_ENCODE_INFO .

  5. Inicialice la estructura CMSG_SIGNED_ENCODE_INFO .

  6. Llame a CryptMsgCalculateEncodedLength para obtener el tamaño del blob del mensaje codificado. Asigne memoria para ella.

  7. Llame a CryptMsgOpenToEncode, pasando CMSG_SIGNED para dwMsgType y un puntero a CMSG_SIGNED_ENCODE_INFO para pvMsgEncodeInfo para obtener un identificador para el mensaje abierto.

  8. Llame a CryptMsgUpdate, pasando el identificador recuperado en el paso 7 y un puntero a los datos que se van a firmar y codificar. Se puede llamar a esta función tantas veces como sea necesario para completar el proceso de codificación.

  9. Llame a CryptMsgGetParam, pasando el identificador recuperado en el paso 7 y los tipos de parámetro adecuados para acceder a los datos deseados codificados. Por ejemplo, pase CMSG_CONTENT_PARAM para obtener un puntero a todo el mensaje PKCS #7 .

    Si el resultado de esta codificación se va a usar como datos internos para otro mensaje codificado, como un mensaje sobre, se debe pasar el parámetro CMSG_BARE_CONTENT_PARAM. Para obtener un ejemplo que muestre esto, vea Código alternativo para codificar un mensaje sobre.

  10. Cierre el mensaje llamando a CryptMsgClose.

El resultado de este procedimiento es un mensaje codificado que contiene los datos originales, el hash cifrado de esos datos (firma) y la información del firmante. También hay un puntero al BLOB codificado deseado.

Para obtener más información sobre la codificación de C, vea Programa C de ejemplo: Firma, Codificación, Descodificación y Comprobación de un mensaje.