Procedimento para codificação e decodificação de mensagens
O procedimento para codificar uma mensagem geral é o seguinte.
Para codificar uma mensagem
- Inicialize as estruturas de dados apropriadas para o tipo de dados desejado.
- 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.
- 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).
- 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.
- 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
- Determine o comprimento necessário para que o buffer mantenha os dados codificados usando CryptMsgCalculateEncodedLength.
- 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.
- Chame CryptMsgUpdate uma vez. Isso faz com que as ações apropriadas sejam executadas na mensagem, dependendo do tipo de mensagem.
- Para processamento adicional da mensagem, como descriptografia adicional ou verificação de assinatura, chame CryptMsgControl, passando a ação desejada em dwCtrlType.
- 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 .
- 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.