Compartilhar via


Procedimento para codificação e decodificação de mensagens

O procedimento para codificar uma mensagem geral é o seguinte.

Para codificar uma mensagem

  1. Inicialize as estruturas de dados apropriadas para o tipo de dados desejado.
  2. Chame CryptMsgOpenToEncode, passando os argumentos necessários. Ao chamar CryptMsgOpenToEncode, se os dados que devem ser fornecidos ao CryptMsgUpdate já tiverem sido codificados por mensagem, passe o identificador de objeto apropriado em pszInnerContentObjID (por exemplo, "1.2.840.113549.1.7.2" para szOID_RSA_signedData). Se pszInnerContentObjID for NULL, supõe-se que o tipo de conteúdo interno não tenha sido codificado anteriormente e seja processado adequadamente.
  3. Chame CryptMsgUpdate quantas vezes forem necessárias para concluir a mensagem. Na última chamada, defina o parâmetro fFinal como TRUE. (Para obter detalhes, consulte CryptMsgUpdate).
  4. Chame CryptMsgGetParam para obter um ponteiro para os parâmetros desejados, como o conteúdo. Para codificar dados simples e gerais, use CMSG_CONTENT_PARAM para o dwParamtype.
  5. Feche a mensagem chamando CryptMsgClose.

Esse procedimento resulta em uma mensagem codificada de um tipo especificado nas chamadas de função.

O procedimento para decodificar uma mensagem geral é o seguinte.

Para decodificar uma mensagem

  1. Determine o comprimento necessário para que o buffer mantenha os dados codificados usando CryptMsgCalculateEncodedLength.
  2. Chame CryptMsgOpenToDecode, passando os argumentos necessários. Para manter a compatibilidade com o Internet Explorer versão 3.0, o parâmetro dwMsgType é fornecido. Os dados assinados criados na Internet Explorer 3.0 não contêm informações de cabeçalho. Portanto, se essa mensagem for extraída de assinaturas de arquivo, o tipo de mensagem deverá ser passado para a função. Se zero for passado para o parâmetro dwMsgType , a função lerá o tipo de mensagem do cabeçalho na mensagem. Se o cabeçalho estiver ausente, a chamada de função falhará. Se tiver êxito, um identificador para a mensagem aberta será retornado.
  3. Chame CryptMsgUpdate uma vez. Isso faz com que as ações apropriadas sejam executadas na mensagem, dependendo do tipo de mensagem.
  4. Para processamento adicional da mensagem, como descriptografia adicional ou verificação de assinatura, chame CryptMsgControl, passando a ação desejada em dwCtrlType.
  5. Chame CryptMsgGetParam para obter um ponteiro para os parâmetros desejados, como o conteúdo. Para decodificar dados gerais simples, use CMSG_CONTENT_PARAM para o parâmetro dwParamtype .
  6. Chame CryptMsgClose para fechar a mensagem.

Para obter um exemplo que implementa essas etapas, consulte Exemplo de programa C: codificação e decodificação de dados. Para obter procedimentos e um exemplo que demonstra o processo de codificação, decodificação e verificação da assinatura de uma mensagem assinada, consulte Exemplo de Programa C: Assinatura, Codificação, Decodificação e Verificação de uma Mensagem.